免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: OstrichFly
打印 上一主题 下一主题

[原创] 写一个块设备驱动 [复制链接]

论坛徽章:
0
201 [报告]
发表于 2011-08-17 14:26 |只看该作者
谢谢楼主

论坛徽章:
0
202 [报告]
发表于 2011-08-17 14:28 |只看该作者
还有作者其他的文章吗

论坛徽章:
0
203 [报告]
发表于 2011-09-04 18:32 |只看该作者
mkfs.ext3 失败,我是在板子里面运行的,没有这个命令。有什么办法达到相同的效果吗,挂载不了

论坛徽章:
0
204 [报告]
发表于 2011-10-27 16:47 |只看该作者

论坛徽章:
0
205 [报告]
发表于 2011-10-29 00:31 |只看该作者
好好学习楼主作品

论坛徽章:
0
206 [报告]
发表于 2011-10-29 00:33 |只看该作者
好好学习楼主作品

论坛徽章:
0
207 [报告]
发表于 2011-10-30 11:55 |只看该作者
学习了

论坛徽章:
0
208 [报告]
发表于 2011-12-07 13:05 |只看该作者
回复 192# blindkey

我和你遇到的问题基本一样,insmod就死机。。哎 你解决了吗?

论坛徽章:
0
209 [报告]
发表于 2011-12-09 09:50 |只看该作者
回复 1# OstrichFly


    楼主好,看了您的第一章,将例子实践了下,但不成功,刚入门,调了一天,不知道怎么办了。
我的环境如下:

ubuntu 10.04 2.6.32-33-generic

.c
  1. #include<linux/init.h>
  2. #include<linux/module.h>
  3. #include<linux/genhd.h>
  4. #include<linux/fs.h>
  5. #include<linux/blkdev.h>

  6. #define SIMP_BLKDEV_DISKNAME "simp_blkdev"
  7. #define SIMP_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR
  8. #define SIMP_BLKDEV_BYTES (8*1024*1024)



  9. static DEFINE_SPINLOCK(rq_lock);
  10. unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES];
  11. static struct gendisk *simp_blkdev_disk;
  12. static struct request_queue *simp_blkdev_queue;//device's request queue

  13. struct block_device_operations simp_blkdev_fops = {
  14.         .owner = THIS_MODULE,
  15. };
  16. //handle request that pass to this device
  17. static void simp_blkdev_do_request(struct request_queue *q){
  18.         struct request *req;
  19.         while( (req = blk_fetch_request(q)) != NULL){
  20.                 if( ( (blk_rq_pos(req) + blk_rq_cur_sectors(req))<<9) > SIMP_BLKDEV_BYTES ){
  21.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":bad request: block=%llu, count=%u\n",(
  22.                                 unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
  23.                         blk_end_request_all(req,-1);
  24.                         continue;
  25.                 }
  26.                

  27.                 switch( rq_data_dir(req)){
  28.                 case READ:
  29.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":read request: block=%llu, count=%u\n",(
  30.                                 unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
  31.                         memcpy(req->buffer,(char *)(simp_blkdev_data + (blk_rq_pos(req)<<9)),blk_rq_cur_bytes(req));
  32.                         blk_end_request_all(req,0);
  33.                         break;
  34.                 case WRITE:
  35.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME ": write request: block=%llu, count=%u\n",(
  36.                                 unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
  37.                         memcpy((char *)(simp_blkdev_data + (blk_rq_pos(req)<<9)),req->buffer,blk_rq_cur_bytes(req));
  38.                         blk_end_request_all(req,0);
  39.                         break;
  40.                 }
  41.         }
  42. }

  43. static int simp_blkdev_init(void){
  44.         int ret;
  45.         //init the request queue by the handler function
  46.         simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,&rq_lock);
  47.         if(!simp_blkdev_queue){
  48.                 ret = -ENOMEM;
  49.                 goto error_init_queue;
  50.         }
  51.         //alloc the resource of gendisk
  52.         simp_blkdev_disk = alloc_disk(1);
  53.         if(!simp_blkdev_disk){
  54.                 ret = -ENOMEM;
  55.                 goto error_alloc_disk;
  56.         }
  57.        

  58.         //populate the gendisk structure
  59.         strcpy(simp_blkdev_disk->disk_name,SIMP_BLKDEV_DISKNAME);
  60.         simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
  61.         simp_blkdev_disk->first_minor = 0;
  62.         simp_blkdev_disk->fops = &simp_blkdev_fops;
  63.         simp_blkdev_disk->queue = simp_blkdev_queue;
  64.         set_capacity(simp_blkdev_disk,SIMP_BLKDEV_BYTES>>9);
  65.        
  66.         add_disk(simp_blkdev_disk);
  67.         printk("module simp_blkdev added.\n");
  68.         return 0;

  69. error_init_queue:
  70.         blk_cleanup_queue(simp_blkdev_queue);

  71. error_alloc_disk:
  72.         return ret;       

  73. }
  74. static void simp_blkdev_exit(void){
  75.         del_gendisk(simp_blkdev_disk);
  76.         put_disk(simp_blkdev_disk);
  77.         blk_cleanup_queue(simp_blkdev_queue);
  78.         printk("module simp_blkdev romoved.\n");
  79. }



  80. module_init(simp_blkdev_init);
  81. module_exit(simp_blkdev_exit);
复制代码
Makefile
  1. obj-m := simp_blkdev.o
  2. KDIR = /lib/modules/$(shell uname -r)/build

  3. all:
  4.         $(MAKE) -C $(KDIR) M=$(PWD)

  5. .PHONY:clean
  6. clean:
  7.         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这个步骤。


谢谢大大指导了 !!!

论坛徽章:
0
210 [报告]
发表于 2011-12-15 12:24 |只看该作者
慢慢看,努力看懂,呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP