- 论坛徽章:
- 0
|
回复 1# OstrichFly
楼主好,看了您的第一章,将例子实践了下,但不成功,刚入门,调了一天,不知道怎么办了。
我的环境如下:
ubuntu 10.04 2.6.32-33-generic
.c- #include<linux/init.h>
- #include<linux/module.h>
- #include<linux/genhd.h>
- #include<linux/fs.h>
- #include<linux/blkdev.h>
- #define SIMP_BLKDEV_DISKNAME "simp_blkdev"
- #define SIMP_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR
- #define SIMP_BLKDEV_BYTES (8*1024*1024)
- static DEFINE_SPINLOCK(rq_lock);
- unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES];
- static struct gendisk *simp_blkdev_disk;
- static struct request_queue *simp_blkdev_queue;//device's request queue
- struct block_device_operations simp_blkdev_fops = {
- .owner = THIS_MODULE,
- };
- //handle request that pass to this device
- static void simp_blkdev_do_request(struct request_queue *q){
- struct request *req;
- while( (req = blk_fetch_request(q)) != NULL){
- if( ( (blk_rq_pos(req) + blk_rq_cur_sectors(req))<<9) > SIMP_BLKDEV_BYTES ){
- printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":bad request: block=%llu, count=%u\n",(
- unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
- blk_end_request_all(req,-1);
- continue;
- }
-
- switch( rq_data_dir(req)){
- case READ:
- printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":read request: block=%llu, count=%u\n",(
- unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
- memcpy(req->buffer,(char *)(simp_blkdev_data + (blk_rq_pos(req)<<9)),blk_rq_cur_bytes(req));
- blk_end_request_all(req,0);
- break;
- case WRITE:
- printk(KERN_ERR SIMP_BLKDEV_DISKNAME ": write request: block=%llu, count=%u\n",(
- unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
- memcpy((char *)(simp_blkdev_data + (blk_rq_pos(req)<<9)),req->buffer,blk_rq_cur_bytes(req));
- blk_end_request_all(req,0);
- break;
- }
- }
- }
- static int simp_blkdev_init(void){
- int ret;
- //init the request queue by the handler function
- simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,&rq_lock);
- if(!simp_blkdev_queue){
- ret = -ENOMEM;
- goto error_init_queue;
- }
- //alloc the resource of gendisk
- simp_blkdev_disk = alloc_disk(1);
- if(!simp_blkdev_disk){
- ret = -ENOMEM;
- goto error_alloc_disk;
- }
-
- //populate the gendisk structure
- strcpy(simp_blkdev_disk->disk_name,SIMP_BLKDEV_DISKNAME);
- simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
- simp_blkdev_disk->first_minor = 0;
- simp_blkdev_disk->fops = &simp_blkdev_fops;
- simp_blkdev_disk->queue = simp_blkdev_queue;
- set_capacity(simp_blkdev_disk,SIMP_BLKDEV_BYTES>>9);
-
- add_disk(simp_blkdev_disk);
- printk("module simp_blkdev added.\n");
- return 0;
- error_init_queue:
- blk_cleanup_queue(simp_blkdev_queue);
- error_alloc_disk:
- return ret;
- }
- static void simp_blkdev_exit(void){
- del_gendisk(simp_blkdev_disk);
- put_disk(simp_blkdev_disk);
- blk_cleanup_queue(simp_blkdev_queue);
- printk("module simp_blkdev romoved.\n");
- }
- module_init(simp_blkdev_init);
- module_exit(simp_blkdev_exit);
复制代码 Makefile- obj-m := simp_blkdev.o
- KDIR = /lib/modules/$(shell uname -r)/build
- all:
- $(MAKE) -C $(KDIR) M=$(PWD)
- .PHONY:clean
- clean:
- rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions *.markers *.symvers *.order
复制代码 这样insmod后直接死机。。。
如果去掉blk_end_request_all(req,0) 可以insmod,但是不能够rmmod ,报错“module simp_blkdev in use”。
我去参考了2.6.32内核的z2ram.c,但是也没有解决问题。。总感觉它的代码里面没有end_request这个步骤。
谢谢大大指导了 !!! |
|