免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2598 | 回复: 8
打印 上一主题 下一主题

简单的内存磁盘驱动。源码。为什么报错呢。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-21 18:38 |只看该作者 |倒序浏览
本帖最后由 ruslin 于 2011-11-21 18:40 编辑

照精华文章改的(因为内核接口变了,我用的是2.6.32),insmod之后,mkfs.ext3 /dev/simp_blkdev整个系统就没响应了,没有panic,就是没有响应。
打印了这样的日志:

[   56.602380] Buffer I/O error on device simp_blkdev, logical block 0

刚开始学习块驱动,搞不懂了。

全部代码就一个文件:
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/sched.h>
  4. #include <linux/types.h>

  5. #include <linux/spinlock.h>
  6. #include <linux/blkdev.h>

  7. MODULE_LICENSE("GPL");


  8. #define SIMP_BLKDEV_DEVICEMAJOR        COMPAQ_SMART2_MAJOR
  9. #define SIMP_BLKDEV_DISKNAME        "simp_blkdev"
  10. #define SIMP_BLKDEV_BYTES        (16*1024*1024)


  11. unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES];

  12. static struct request_queue *simp_blkdev_queue;
  13. static struct gendisk *simp_blkdev_disk;

  14. static void simp_blkdev_do_request(struct request_queue *q);

  15. static void simp_blkdev_do_request(struct request_queue *q)
  16. {
  17.         struct request *req;
  18.         while ((req = blk_fetch_request(q)) != NULL) {
  19.                 if ((blk_rq_pos(req) + blk_rq_cur_sectors(req)) << 9
  20.                         > SIMP_BLKDEV_BYTES) {
  21.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME
  22.                                 ": bad request: block=%llu, count=%u\n",
  23.                                 (unsigned long long)blk_rq_pos(req),
  24.                                 blk_rq_cur_sectors(req));
  25.                         blk_end_request_all(req, 0);
  26.                         continue;
  27.                 }

  28.                 switch (rq_data_dir(req)) {
  29.                 case READ:
  30.                         memcpy(req->buffer,
  31.                                 simp_blkdev_data + (blk_rq_pos(req) << 9),
  32.                                 blk_rq_cur_sectors(req) << 9);
  33.                         blk_end_request_all(req, 1);
  34.                         break;
  35.                 case WRITE:
  36.                         memcpy(simp_blkdev_data + (blk_rq_pos(req) << 9),
  37.                                 req->buffer, blk_rq_cur_sectors(req) << 9);
  38.                         blk_end_request_all(req, 1);
  39.                         break;
  40.                 default:
  41.                         printk("unkown request\n");
  42.                         break;
  43.                 }
  44.         }
  45. }


  46. struct block_device_operations simp_blkdev_fops = {
  47.         .owner                = THIS_MODULE,
  48. };

  49. static int __init simp_blkdev_init(void)
  50. {
  51.         int ret;

  52.         simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request, NULL);
  53.         if (!simp_blkdev_queue) {
  54.                 ret = -ENOMEM;
  55.                 goto err_init_queue;
  56.         }

  57.         simp_blkdev_disk = alloc_disk(1);
  58.         if (!simp_blkdev_disk) {
  59.                 ret = -ENOMEM;
  60.                 goto err_alloc_disk;
  61.         }

  62.         strcpy(simp_blkdev_disk->disk_name, SIMP_BLKDEV_DISKNAME);
  63.         simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
  64.         simp_blkdev_disk->first_minor = 0;
  65.         simp_blkdev_disk->fops = &simp_blkdev_fops;
  66.         simp_blkdev_disk->queue = simp_blkdev_queue;
  67.         set_capacity(simp_blkdev_disk, SIMP_BLKDEV_BYTES>>9);
  68.         add_disk(simp_blkdev_disk);

  69.         return 0;

  70. err_alloc_disk:
  71.         blk_cleanup_queue(simp_blkdev_queue);
  72. err_init_queue:
  73.         return ret;
  74. }

  75. static void __exit simp_blkdev_exit(void)
  76. {
  77.         del_gendisk(simp_blkdev_disk);
  78.         put_disk(simp_blkdev_disk);
  79.         blk_cleanup_queue(simp_blkdev_queue);
  80. }

  81. module_init(simp_blkdev_init);
  82. module_exit(simp_blkdev_exit);
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-11-22 09:26 |只看该作者
这么久,都没人顶一下啊。。。。{:3_186:}

论坛徽章:
0
3 [报告]
发表于 2011-11-22 11:26 |只看该作者
找到问题了吗?等下回去我帮你看下兄弟

论坛徽章:
0
4 [报告]
发表于 2011-11-22 13:04 |只看该作者
还没有时间看,劳烦大家帮忙下了。。

论坛徽章:
0
5 [报告]
发表于 2011-11-23 16:40 |只看该作者
mark一下

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
6 [报告]
发表于 2011-11-28 10:25 |只看该作者
帮顶! 同样问题!

论坛徽章:
0
7 [报告]
发表于 2011-11-28 10:51 |只看该作者
回复 1# ruslin


   

你可以参考内核自带的代码
z2ram.c

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
8 [报告]
发表于 2011-11-28 11:11 |只看该作者
不是很了解,感觉像结束bio的时候用错了api。看一下你那个版本内核drivers/block/brd.c里brd_make_request是怎么做的吧。

论坛徽章:
0
9 [报告]
发表于 2011-12-07 15:00 |只看该作者
回复 1# ruslin


    我这参考z2ram.c稍微修改了下,去掉了blk_end_request_all。不死机了,但仍然不能mount,你解决了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP