请教高手一个简单的块驱动程序,为什么无法insmod
我按照教程写了一个很简单的驱动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;
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");
报什么错 insmod 就不动了,也不退出 再开一个终端,dmesg一下,看看到哪里出问题了!!! 光说个 “不动了”,不是一个技术人员汇报问题的方式。
你的测试系统是远程登陆的,还是可以直接登录。
如果可以直接登录,虚拟控制台上应该可以看到有 oops 之类信息 以下是dmesg
----- Hello. World----
:run simple_blk.....128
INFO: task insmod:2304 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
insmod D 5d383637 02304 2301 0x00000000
df545cd4 00000086 3335302e 5d383637 c1020020 df545c6c cdbd350c c183a8c0
c1266178 00000039 cdbd3508 c183a8c0 c183a8c0 de8068c0 cdbd3280 c1731f60
df545d20 df545c98 c150717f e0bb3024 df545ca4 cd8a8e18 df545ccc c1078088
Call Trace:
[<c1020020>] ? speedstep_target+0x10/0xc0
[<c1266178>] ? blk_complete_sgv4_hdr_rq+0xd8/0x190
[<c150717f>] ? printk+0x30/0x39
[<c1078088>] ? ktime_get_ts+0xf8/0x120
[<c1507a4f>] io_schedule+0x5f/0xa0
[<c10e1d3a>] sync_page+0x3a/0x50
[<c1508147>] __wait_on_bit_lock+0x47/0x90
[<c10e1d00>] ? sync_page+0x0/0x50
[<c10e1cd8>] __lock_page+0x78/0x80
[<c106d3c0>] ? wake_bit_function+0x0/0x60
[<c10e29a7>] do_read_cache_page+0x137/0x160
[<c1153bc0>] ? blkdev_readpage+0x0/0x20
[<c10e2a24>] read_cache_page_async+0x24/0x30
[<c10e2a47>] read_cache_page+0x17/0x30
[<c117ae0d>] read_dev_sector+0x3d/0x90
[<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[<c117be32>] adfspart_check_ICS+0x62/0x280
[<c178ffff>] ? unpack_to_rootfs+0x1a8/0x270
[<c1279f52>] ? vsnprintf+0x2e2/0x3c0
[<c127a08a>] ? snprintf+0x1a/0x20
[<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[<c117b497>] check_partition+0xe7/0x1f0
[<c117bb0b>] rescan_partitions+0xbb/0x380
[<c1272de2>] ? kobject_get+0x12/0x20
[<c1263948>] ? get_disk+0x48/0xa0
[<c1263220>] ? exact_match+0x0/0x10
[<c1154d7b>] __blkdev_get+0x16b/0x330
[<c106d364>] ? wake_up_bit+0x24/0x30
[<c1154f89>] blkdev_get+0x49/0x230
[<c1264d66>] register_disk+0x146/0x160
[<c1263ca2>] ? blk_register_region+0x32/0x40
[<c1263220>] ? exact_match+0x0/0x10
[<c1264e1b>] add_disk+0x9b/0x150
[<c1263220>] ? exact_match+0x0/0x10
[<c12639a0>] ? exact_lock+0x0/0x20
[<e08f70f2>] init_base+0xf2/0x1000
[<c1001255>] do_one_initcall+0x35/0x170
[<e08f7000>] ? init_base+0x0/0x1000
[<c108899b>] sys_init_module+0xdb/0x230
[<c1125925>] ? sys_close+0x75/0xd0
[<c1509bf4>] syscall_call+0x7/0xb
INFO: task insmod:2304 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
insmod D 5d383637 02304 2301 0x00000000
df545cd4 00000086 3335302e 5d383637 c1020020 df545c6c cdbd350c c183a8c0
c1266178 00000039 cdbd3508 c183a8c0 c183a8c0 de8068c0 cdbd3280 c1731f60
df545d20 df545c98 c150717f e0bb3024 df545ca4 cd8a8e18 df545ccc c1078088
Call Trace:
[<c1020020>] ? speedstep_target+0x10/0xc0
[<c1266178>] ? blk_complete_sgv4_hdr_rq+0xd8/0x190
[<c150717f>] ? printk+0x30/0x39
[<c1078088>] ? ktime_get_ts+0xf8/0x120
[<c1507a4f>] io_schedule+0x5f/0xa0
[<c10e1d3a>] sync_page+0x3a/0x50
[<c1508147>] __wait_on_bit_lock+0x47/0x90
[<c10e1d00>] ? sync_page+0x0/0x50
[<c10e1cd8>] __lock_page+0x78/0x80
[<c106d3c0>] ? wake_bit_function+0x0/0x60
[<c10e29a7>] do_read_cache_page+0x137/0x160
[<c1153bc0>] ? blkdev_readpage+0x0/0x20
[<c10e2a24>] read_cache_page_async+0x24/0x30
[<c10e2a47>] read_cache_page+0x17/0x30
[<c117ae0d>] read_dev_sector+0x3d/0x90
[<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[<c117be32>] adfspart_check_ICS+0x62/0x280
[<c178ffff>] ? unpack_to_rootfs+0x1a8/0x270
[<c1279f52>] ? vsnprintf+0x2e2/0x3c0
[<c127a08a>] ? snprintf+0x1a/0x20
[<c117bdd0>] ? adfspart_check_ICS+0x0/0x280
[<c117b497>] check_partition+0xe7/0x1f0
[<c117bb0b>] rescan_partitions+0xbb/0x380
[<c1272de2>] ? kobject_get+0x12/0x20
[<c1263948>] ? get_disk+0x48/0xa0
[<c1263220>] ? exact_match+0x0/0x10
[<c1154d7b>] __blkdev_get+0x16b/0x330
[<c106d364>] ? wake_up_bit+0x24/0x30
[<c1154f89>] blkdev_get+0x49/0x230
[<c1264d66>] register_disk+0x146/0x160
[<c1263ca2>] ? blk_register_region+0x32/0x40
[<c1263220>] ? exact_match+0x0/0x10
[<c1264e1b>] add_disk+0x9b/0x150
[<c1263220>] ? exact_match+0x0/0x10
[<c12639a0>] ? exact_lock+0x0/0x20
[<e08f70f2>] init_base+0xf2/0x1000
[<c1001255>] do_one_initcall+0x35/0x170
[<e08f7000>] ? init_base+0x0/0x1000
[<c108899b>] sys_init_module+0xdb/0x230
[<c1125925>] ? sys_close+0x75/0xd0
[<c1509bf4>] syscall_call+0x7/0xb lsmod:
Module SizeUsed by
driver 10664862
used 就等于2了,我觉得比较疑惑为什么我驱动刚刚加载,就能收到io schedule 的请求。 没有人解答? 继续等 我几天前看过这个帖子的,当时想回复你,但是我没有注册
我当时也遇到过这个问题,后来经过debug,发现是simple_blkdev_do_request导致的,于是我通过查看linux code ,模仿别人写了一个就ok了。
模仿的code 是 do_z2_request(用source insight搜一下),当时我也没有比较两个函数,但是仔细看看的话应该能找到。你就找找原因吧,到时候发到帖子上。
页:
[1]
2