- 论坛徽章:
- 0
|
我按照教程写了一个很简单的驱动demo,但是insmod driver.ko的时候就不动了,搞不明白,请指教,谢谢。我系统是ubuntu10.10- #include <linux/module.h>
- #include <linux/blkdev.h>
- #include <linux/hdreg.h>
- #include <linux/version.h>
- #define SIMP_BLKDEV_MAJOC COMPAQ_SMART2_MAJOR
- #define SIMP_BLKDEV_DISKNAME "simple_blkdev"
- #define SIMP_BLKDEV_BYTES (1*1024*1024)
- static struct request_queue *simple_blkdev_queue;
- static struct gendisk *simple_blkdev_disk;
- unsigned char simple_blkdev_data[SIMP_BLKDEV_BYTES];
- static DEFINE_SPINLOCK(dev_lock);
- static void simple_blkdev_do_request(struct request_queue* q) {
- struct request *req;
- printk(KERN_ALERT":run simple_blk.....%u",q->nr_requests);
- return;
- /*
- while((req = blk_fetch_request(q)) != NULL) {
- if ((blk_rq_pos(req) + blk_rq_cur_bytes(req)) > SIMP_BLKDEV_BYTES) {
- printk(KERN_ALERT SIMP_BLKDEV_DISKNAME":bad request: block=%llu, count=%u\n",
- (unsigned long long)blk_rq_pos(req),blk_rq_cur_bytes(req));
- blk_end_request_cur(req,-1);
- break;
- }
- switch (rq_data_dir(req)) {
- case READ:
- memcpy(req->buffer, simple_blkdev_data + blk_rq_cur_bytes(req), blk_rq_bytes(req));
- blk_end_request_cur(req,0);
- break;
- case WRITE:
- memcpy(simple_blkdev_data + blk_rq_cur_bytes(req), req->buffer, blk_rq_bytes(req));
- blk_end_request_cur(req,0);
- break;
- default:
- break;
- };
- };*/
- };
- struct block_device_operations simple_blkdev_fops = {
- .owner = THIS_MODULE,
- };
- static int __init init_base(void)
- {
- int ret;
- printk(KERN_ALERT"----- Hello. World----\n");
- if (register_blkdev(SIMP_BLKDEV_MAJOC,SIMP_BLKDEV_DISKNAME)) {
- return -1;
- }
- simple_blkdev_queue = blk_init_queue(simple_blkdev_do_request,&dev_lock);
- blk_queue_max_hw_sectors(simple_blkdev_queue,255);
- blk_queue_logical_block_size(simple_blkdev_queue,512);
- if (!simple_blkdev_queue) {
- printk(KERN_ALERT"simple_blk_queue----\n");
- ret = -ENOMEM;
- goto err_init_queue;
- }
-
- simple_blkdev_disk = alloc_disk(64);
- if (!simple_blkdev_disk) {
- printk(KERN_ALERT"failed----\n");
- ret = -ENOMEM;
- goto err_alloc_disk;
- }
- strcpy(simple_blkdev_disk->disk_name, SIMP_BLKDEV_DISKNAME);
- simple_blkdev_disk->major = SIMP_BLKDEV_MAJOC;
- simple_blkdev_disk->first_minor = 8;
- simple_blkdev_disk->fops = &simple_blkdev_fops;
- simple_blkdev_disk->queue = simple_blkdev_queue;
- set_capacity(simple_blkdev_disk, SIMP_BLKDEV_BYTES >> 9);
- add_disk(simple_blkdev_disk);
- printk(KERN_ALERT"end..................----\n");
- return 0;
- err_alloc_disk:
- blk_cleanup_queue(simple_blkdev_queue);
- err_init_queue:
- return ret;
- }
- static void __exit exit_base(void)
- {
- printk(KERN_ALERT"----- Bye ------\n");
- del_gendisk(simple_blkdev_disk);
- put_disk(simple_blkdev_disk);
- blk_cleanup_queue(simple_blkdev_queue);
- }
- module_init(init_base);
- module_exit(exit_base);
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("sxiong");
- MODULE_DESCRIPTION("HD");
复制代码 |
|