免费注册 查看新帖 |

Chinaunix

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

请教高手一个简单的块驱动程序,为什么无法insmod [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-19 00:35 |只看该作者 |倒序浏览
我按照教程写了一个很简单的驱动demo,但是insmod driver.ko的时候就不动了,搞不明白,请指教,谢谢。我系统是ubuntu10.10
  1. #include <linux/module.h>
  2. #include <linux/blkdev.h>
  3. #include <linux/hdreg.h>
  4. #include <linux/version.h>

  5. #define SIMP_BLKDEV_MAJOC COMPAQ_SMART2_MAJOR
  6. #define SIMP_BLKDEV_DISKNAME "simple_blkdev"
  7. #define SIMP_BLKDEV_BYTES   (1*1024*1024)

  8. static struct request_queue *simple_blkdev_queue;
  9. static struct gendisk *simple_blkdev_disk;
  10. unsigned char simple_blkdev_data[SIMP_BLKDEV_BYTES];
  11. static DEFINE_SPINLOCK(dev_lock);

  12. static void simple_blkdev_do_request(struct request_queue* q) {
  13.     struct request *req;
  14.     printk(KERN_ALERT":run simple_blk.....%u",q->nr_requests);
  15.     return;
  16.     /*
  17.     while((req = blk_fetch_request(q)) != NULL) {
  18.         if ((blk_rq_pos(req) + blk_rq_cur_bytes(req))  > SIMP_BLKDEV_BYTES) {
  19.             printk(KERN_ALERT SIMP_BLKDEV_DISKNAME":bad request: block=%llu, count=%u\n",
  20.                     (unsigned long long)blk_rq_pos(req),blk_rq_cur_bytes(req));
  21.             blk_end_request_cur(req,-1);
  22.             break;
  23.         }

  24.         switch (rq_data_dir(req)) {
  25.             case READ:
  26.                 memcpy(req->buffer, simple_blkdev_data + blk_rq_cur_bytes(req), blk_rq_bytes(req));
  27.                 blk_end_request_cur(req,0);
  28.                 break;
  29.             case WRITE:
  30.                 memcpy(simple_blkdev_data + blk_rq_cur_bytes(req), req->buffer, blk_rq_bytes(req));
  31.                 blk_end_request_cur(req,0);
  32.                 break;
  33.             default:
  34.                 break;
  35.         };

  36.     };*/
  37. };

  38. struct block_device_operations simple_blkdev_fops = {
  39.     .owner = THIS_MODULE,
  40. };

  41. static int __init init_base(void)
  42. {
  43.     int ret;
  44.     printk(KERN_ALERT"----- Hello. World----\n");
  45.     if (register_blkdev(SIMP_BLKDEV_MAJOC,SIMP_BLKDEV_DISKNAME)) {
  46.         return -1;
  47.     }

  48.     simple_blkdev_queue = blk_init_queue(simple_blkdev_do_request,&dev_lock);
  49.     blk_queue_max_hw_sectors(simple_blkdev_queue,255);
  50.     blk_queue_logical_block_size(simple_blkdev_queue,512);
  51.     if (!simple_blkdev_queue) {
  52.         printk(KERN_ALERT"simple_blk_queue----\n");
  53.         ret = -ENOMEM;
  54.         goto err_init_queue;
  55.     }
  56.    
  57.     simple_blkdev_disk = alloc_disk(64);
  58.     if (!simple_blkdev_disk) {
  59.         printk(KERN_ALERT"failed----\n");
  60.         ret = -ENOMEM;
  61.         goto err_alloc_disk;
  62.     }

  63.     strcpy(simple_blkdev_disk->disk_name, SIMP_BLKDEV_DISKNAME);
  64.     simple_blkdev_disk->major = SIMP_BLKDEV_MAJOC;
  65.     simple_blkdev_disk->first_minor = 8;
  66.     simple_blkdev_disk->fops = &simple_blkdev_fops;
  67.     simple_blkdev_disk->queue = simple_blkdev_queue;
  68.     set_capacity(simple_blkdev_disk, SIMP_BLKDEV_BYTES >> 9);
  69.     add_disk(simple_blkdev_disk);
  70.     printk(KERN_ALERT"end..................----\n");
  71.     return 0;

  72. err_alloc_disk:
  73.     blk_cleanup_queue(simple_blkdev_queue);

  74. err_init_queue:
  75.     return ret;
  76. }

  77. static void __exit exit_base(void)
  78. {
  79.     printk(KERN_ALERT"----- Bye ------\n");
  80.     del_gendisk(simple_blkdev_disk);
  81.     put_disk(simple_blkdev_disk);
  82.     blk_cleanup_queue(simple_blkdev_queue);
  83. }

  84. module_init(init_base);
  85. module_exit(exit_base);

  86. MODULE_LICENSE("GPL");
  87. MODULE_AUTHOR("sxiong");
  88. MODULE_DESCRIPTION("HD");
复制代码

driver.rar

1.09 KB, 下载次数: 79

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2011-06-19 20:14 |只看该作者
报什么错

论坛徽章:
0
3 [报告]
发表于 2011-06-19 22:00 |只看该作者
insmod 就不动了,也不退出

论坛徽章:
0
4 [报告]
发表于 2011-06-20 08:41 |只看该作者
再开一个终端,dmesg一下,看看到哪里出问题了!!!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2011-06-20 10:30 |只看该作者
光说个 “不动了”,不是一个技术人员汇报问题的方式。

你的测试系统是远程登陆的,还是可以直接登录。
如果可以直接登录,虚拟控制台上应该可以看到有 oops 之类信息

论坛徽章:
0
6 [报告]
发表于 2011-06-20 10:52 |只看该作者
以下是dmesg
[  248.052524] ----- Hello. World----
[  248.053768] :run simple_blk.....128
[  480.548887] INFO: task insmod:2304 blocked for more than 120 seconds.
[  480.548891] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[  480.548893] insmod          D 5d383637     0  2304   2301 0x00000000
[  480.548897]  df545cd4 00000086 3335302e 5d383637 c1020020 df545c6c cdbd350c c183a8c0
[  480.548901]  c1266178 00000039 cdbd3508 c183a8c0 c183a8c0 de8068c0 cdbd3280 c1731f60
[  480.548904]  df545d20 df545c98 c150717f e0bb3024 df545ca4 cd8a8e18 df545ccc c1078088
[  480.548908] Call Trace:
[  480.548919]  [<c1020020>] ? speedstep_target+0x10/0xc0
[  480.548923]  [<c1266178>] ? blk_complete_sgv4_hdr_rq+0xd8/0x190
[  480.548945]  [<c150717f>] ? printk+0x30/0x39
[  480.548953]  [<c1078088>] ? ktime_get_ts+0xf8/0x120
[  480.548956]  [<c1507a4f>] io_schedule+0x5f/0xa0
[  480.548958]  [<c10e1d3a>] sync_page+0x3a/0x50
[  480.548961]  [<c1508147>] __wait_on_bit_lock+0x47/0x90
[  480.548963]  [<c10e1d00>] ? sync_page+0x0/0x50
[  480.548965]  [<c10e1cd8>] __lock_page+0x78/0x80
[  480.548995]  [<c106d3c0>] ? wake_bit_function+0x0/0x60
[  480.548998]  [<c10e29a7>] do_read_cache_page+0x137/0x160
[  480.549001]  [<c1153bc0>] ? blkdev_readpage+0x0/0x20
[  480.549003]  [<c10e2a24>] read_cache_page_async+0x24/0x30
[  480.549005]  [<c10e2a47>] read_cache_page+0x17/0x30
[  480.549010]  [<c117ae0d>] read_dev_sector+0x3d/0x90
[  480.549013]  [<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[  480.549015]  [<c117be32>] adfspart_check_ICS+0x62/0x280
[  480.549024]  [<c178ffff>] ? unpack_to_rootfs+0x1a8/0x270
[  480.549029]  [<c1279f52>] ? vsnprintf+0x2e2/0x3c0
[  480.549032]  [<c127a08a>] ? snprintf+0x1a/0x20
[  480.549034]  [<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[  480.549036]  [<c117b497>] check_partition+0xe7/0x1f0
[  480.549039]  [<c117bb0b>] rescan_partitions+0xbb/0x380
[  480.549041]  [<c1272de2>] ? kobject_get+0x12/0x20
[  480.549044]  [<c1263948>] ? get_disk+0x48/0xa0
[  480.549047]  [<c1263220>] ? exact_match+0x0/0x10
[  480.549049]  [<c1154d7b>] __blkdev_get+0x16b/0x330
[  480.549052]  [<c106d364>] ? wake_up_bit+0x24/0x30
[  480.549054]  [<c1154f89>] blkdev_get+0x49/0x230
[  480.549056]  [<c1264d66>] register_disk+0x146/0x160
[  480.549059]  [<c1263ca2>] ? blk_register_region+0x32/0x40
[  480.549061]  [<c1263220>] ? exact_match+0x0/0x10
[  480.549063]  [<c1264e1b>] add_disk+0x9b/0x150
[  480.549065]  [<c1263220>] ? exact_match+0x0/0x10
[  480.549067]  [<c12639a0>] ? exact_lock+0x0/0x20
[  480.549090]  [<e08f70f2>] init_base+0xf2/0x1000 [driver]
[  480.549094]  [<c1001255>] do_one_initcall+0x35/0x170
[  480.549097]  [<e08f7000>] ? init_base+0x0/0x1000 [driver]
[  480.549100]  [<c108899b>] sys_init_module+0xdb/0x230
[  480.549104]  [<c1125925>] ? sys_close+0x75/0xd0
[  480.549108]  [<c1509bf4>] syscall_call+0x7/0xb
[  600.548215] INFO: task insmod:2304 blocked for more than 120 seconds.
[  600.548219] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[  600.548221] insmod          D 5d383637     0  2304   2301 0x00000000
[  600.548224]  df545cd4 00000086 3335302e 5d383637 c1020020 df545c6c cdbd350c c183a8c0
[  600.548228]  c1266178 00000039 cdbd3508 c183a8c0 c183a8c0 de8068c0 cdbd3280 c1731f60
[  600.548232]  df545d20 df545c98 c150717f e0bb3024 df545ca4 cd8a8e18 df545ccc c1078088
[  600.548235] Call Trace:
[  600.548242]  [<c1020020>] ? speedstep_target+0x10/0xc0
[  600.548246]  [<c1266178>] ? blk_complete_sgv4_hdr_rq+0xd8/0x190
[  600.548249]  [<c150717f>] ? printk+0x30/0x39
[  600.548257]  [<c1078088>] ? ktime_get_ts+0xf8/0x120
[  600.548260]  [<c1507a4f>] io_schedule+0x5f/0xa0
[  600.548263]  [<c10e1d3a>] sync_page+0x3a/0x50
[  600.548265]  [<c1508147>] __wait_on_bit_lock+0x47/0x90
[  600.548267]  [<c10e1d00>] ? sync_page+0x0/0x50
[  600.548269]  [<c10e1cd8>] __lock_page+0x78/0x80
[  600.548272]  [<c106d3c0>] ? wake_bit_function+0x0/0x60
[  600.548275]  [<c10e29a7>] do_read_cache_page+0x137/0x160
[  600.548277]  [<c1153bc0>] ? blkdev_readpage+0x0/0x20
[  600.548280]  [<c10e2a24>] read_cache_page_async+0x24/0x30
[  600.548282]  [<c10e2a47>] read_cache_page+0x17/0x30
[  600.548285]  [<c117ae0d>] read_dev_sector+0x3d/0x90
[  600.548287]  [<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[  600.548289]  [<c117be32>] adfspart_check_ICS+0x62/0x280
[  600.548311]  [<c178ffff>] ? unpack_to_rootfs+0x1a8/0x270
[  600.548314]  [<c1279f52>] ? vsnprintf+0x2e2/0x3c0
[  600.548317]  [<c127a08a>] ? snprintf+0x1a/0x20
[  600.548319]  [<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[  600.548321]  [<c117b497>] check_partition+0xe7/0x1f0
[  600.548323]  [<c117bb0b>] rescan_partitions+0xbb/0x380
[  600.548326]  [<c1272de2>] ? kobject_get+0x12/0x20
[  600.548329]  [<c1263948>] ? get_disk+0x48/0xa0
[  600.548331]  [<c1263220>] ? exact_match+0x0/0x10
[  600.548334]  [<c1154d7b>] __blkdev_get+0x16b/0x330
[  600.548336]  [<c106d364>] ? wake_up_bit+0x24/0x30
[  600.548338]  [<c1154f89>] blkdev_get+0x49/0x230
[  600.548370]  [<c1264d66>] register_disk+0x146/0x160
[  600.548373]  [<c1263ca2>] ? blk_register_region+0x32/0x40
[  600.548375]  [<c1263220>] ? exact_match+0x0/0x10
[  600.548377]  [<c1264e1b>] add_disk+0x9b/0x150
[  600.548379]  [<c1263220>] ? exact_match+0x0/0x10
[  600.548381]  [<c12639a0>] ? exact_lock+0x0/0x20
[  600.548388]  [<e08f70f2>] init_base+0xf2/0x1000 [driver]
[  600.548391]  [<c1001255>] do_one_initcall+0x35/0x170
[  600.548393]  [<e08f7000>] ? init_base+0x0/0x1000 [driver]
[  600.548396]  [<c108899b>] sys_init_module+0xdb/0x230
[  600.548399]  [<c1125925>] ? sys_close+0x75/0xd0
[  600.548402]  [<c1509bf4>] syscall_call+0x7/0xb

论坛徽章:
0
7 [报告]
发表于 2011-06-20 10:55 |只看该作者
lsmod:
Module                  Size  Used by
driver               1066486  2

used 就等于2了,我觉得比较疑惑为什么我驱动刚刚加载,就能收到io schedule 的请求。

论坛徽章:
0
8 [报告]
发表于 2011-06-23 20:37 |只看该作者
没有人解答?

论坛徽章:
0
9 [报告]
发表于 2011-06-29 11:00 |只看该作者
继续等

论坛徽章:
0
10 [报告]
发表于 2011-06-29 14:28 |只看该作者
我几天前看过这个帖子的,当时想回复你,但是我没有注册
我当时也遇到过这个问题,后来经过debug,发现是simple_blkdev_do_request导致的,于是我通过查看linux code ,模仿别人写了一个就ok了。
模仿的code 是 do_z2_request(用source insight搜一下),当时我也没有比较两个函数,但是仔细看看的话应该能找到。你就找找原因吧,到时候发到帖子上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP