xsylinux 发表于 2011-06-19 00:35

请教高手一个简单的块驱动程序,为什么无法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");

amarant 发表于 2011-06-19 20:14

报什么错

xsylinux 发表于 2011-06-19 22:00

insmod 就不动了,也不退出

jjinl 发表于 2011-06-20 08:41

再开一个终端,dmesg一下,看看到哪里出问题了!!!

Godbach 发表于 2011-06-20 10:30

光说个 “不动了”,不是一个技术人员汇报问题的方式。

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

xsylinux 发表于 2011-06-20 10:52

以下是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

xsylinux 发表于 2011-06-20 10:55

lsmod:
Module                  SizeUsed by
driver               10664862

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

xsylinux 发表于 2011-06-23 20:37

没有人解答?

xsylinux 发表于 2011-06-29 11:00

继续等

npuazm 发表于 2011-06-29 14:28

我几天前看过这个帖子的,当时想回复你,但是我没有注册
我当时也遇到过这个问题,后来经过debug,发现是simple_blkdev_do_request导致的,于是我通过查看linux code ,模仿别人写了一个就ok了。
模仿的code 是 do_z2_request(用source insight搜一下),当时我也没有比较两个函数,但是仔细看看的话应该能找到。你就找找原因吧,到时候发到帖子上。
页: [1] 2
查看完整版本: 请教高手一个简单的块驱动程序,为什么无法insmod