1、学写块设备驱动(一)----了解gendisk及request处理函数以下是一个最简单的块设备驱动,写完可以对编写块设备驱动的框架有初步了解。环境:Linux2.6.29源码:simp_blkdev.c:#include#include#include#include#include#define SIMP_BLKDEV_DISKNAME "simp_blkdev"#define SI
3、 queuestruct block_device_operations simp_blkdev_fops = { .owner = THIS_MODULE,};//handle request that pass to this devicestatic void simp_blkdev_do_request(struct request_queue *q){ struct request *req; while( (req = elv_next_request(q)) != NULL){ if
4、( ( (req->sector + req->current_nr_sectors)<<9) > SIMP_BLKDEV_BYTES ){ printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":bad request: block=%llu, count=%u",( unsigned long long )req->sector,req->current_nr_sectors); end_request(req,0); c
5、ontinue; } switch( rq_data_dir(req)){ case READ: memcpy(req->buffer,(simp_blkdev_data + (req->sector<<9)),req->current_nr_sectors << 9); end_request(req,1); break; case WRITE: mem
6、cpy((simp_blkdev_data + (req->sector<<9)),req->buffer,req->current_nr_sectors << 9); end_request(req,1); break; } } } static int simp_blkdev_init(void){ int ret; //init the request queue by the handler function
7、 simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,&rq_lock); if(!simp_blkdev_queue){ ret = -ENOMEM; goto error_init_queue; } //alloc the resource of gendisk simp_blkdev_disk = alloc_disk(1); if(!simp_blkdev_disk){
8、 ret = -ENOMEM; goto error_alloc_disk; } //populate the gendisk structure strcpy(simp_blkdev_disk->disk