块设备驱动 2.6.36

loover821 2011-04-30 05:04:12
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>
#include <linux/bio.h>
#include <linux/elevator.h>
#define SIMP_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR
#define SIMP_BLKDEV_DISKNAME "simp_blkdev"
#define SIMP_BLKDEV_BYTES (1024*1024)
unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES];

static struct request_queue *simp_blkdev_queue;
static struct gendisk *simp_blkdev_disk;

static void simp_blkdev_do_request(struct request_queue *q);

struct block_device_operations simp_blkdev_fops = {
.owner = THIS_MODULE,
};

static int __init simp_blkdev_init(void)
{
int ret;

simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request, NULL);
if (!simp_blkdev_queue) {
ret = -ENOMEM;
goto err_init_queue;
}

simp_blkdev_disk = alloc_disk(1);
if (!simp_blkdev_disk) {
ret = -ENOMEM;
goto err_alloc_disk;
}

strcpy(simp_blkdev_disk->disk_name, SIMP_BLKDEV_DISKNAME);
simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
simp_blkdev_disk->first_minor = 0;
simp_blkdev_disk->fops = &simp_blkdev_fops;
simp_blkdev_disk->queue = simp_blkdev_queue;
set_capacity(simp_blkdev_disk, SIMP_BLKDEV_BYTES>>9);
add_disk(simp_blkdev_disk);

return 0;

err_alloc_disk:
blk_cleanup_queue(simp_blkdev_queue);
err_init_queue:
return ret;
}

static void __exit simp_blkdev_exit(void)
{
del_gendisk(simp_blkdev_disk);
put_disk(simp_blkdev_disk);
blk_cleanup_queue(simp_blkdev_queue);
}

static void simp_blkdev_do_request(struct request_queue *q)
{
struct request *req;
while ((req = blk_peek_request(q)) != NULL) {
if ((blk_rq_pos(req) + blk_rq_sectors(req)) << 9
> SIMP_BLKDEV_BYTES) {
printk(KERN_ERR SIMP_BLKDEV_DISKNAME
": bad request: block=%llu, count=%u\n",
(unsigned long long)blk_rq_pos(req),
blk_rq_sectors(req));
blk_end_request_cur(req, 0);
continue;
}

switch (rq_data_dir(req)) {
case READ:
memcpy(req->buffer,
simp_blkdev_data + (blk_rq_pos(req) << 9),
blk_rq_sectors(req) << 9);
blk_end_request_cur(req, 1);
break;
case WRITE:
memcpy(simp_blkdev_data + (blk_rq_pos(req) << 9),
req->buffer, blk_rq_sectors(req) << 9);
blk_end_request_cur(req, 1);
break;
default:
/* No default because rq_data_dir(req) is 1 bit */
break;
}
}
}

module_init(simp_blkdev_init);
module_exit(simp_blkdev_exit);

上面是从网上找的一个块设备的驱动,编译能通过,但是只要一挂载就会马上死机,求大神指导阿,我的内核是2.6.36.4.。。。感激不尽。。。
...全文
111 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
把blk_end_request_cur换成__blk_end_request_cur
yuefei0304 2011-08-01
  • 打赏
  • 举报
回复
同问啊,我的一个块设备驱动也是一加载就死机,要是把set_capacity注释掉的话再编译加载就不死机了,莫非是set_capacity的问题?
loover821 2011-04-30
  • 打赏
  • 举报
回复
谢谢。。。

18,829

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧