- 论坛徽章:
- 0
|
看完了两遍...今天自己动手就悲剧了...
毕竟是时间过去一段时间了 块设备部分也有了变化,自己查了查,
然后编译通过了 但是加载就悲剧····还是第一章····这不是打击我积极性么····
楼主能给看看不....- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/blkdev.h>
- MODULE_LICENSE("Dual BSD/GPL");
- #define MY_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR
- #define MY_BLKDEV_DISKNAME "mydisk"
- #define MY_BLKDEV_SIZE (16*1024*1024)
- static struct request_queue *my_blkdev_queue;
- static struct gendisk *my_blkdev_disk;
- unsigned char my_blkdev_data[MY_BLKDEV_SIZE];
- static void my_blkdev_do_request(struct request_queue *q);
- struct block_device_operations my_blkdev_fops ={ .owner = THIS_MODULE,};
- static int __init my_blkdev_init(void )
- {
-
- int ret;
- printk(KERN_ALERT MY_BLKDEV_DISKNAME"init!");
- my_blkdev_queue = blk_init_queue(my_blkdev_do_request,NULL);
- if(!my_blkdev_queue){
- ret = -ENOMEM;
- goto err_init_queue;
- }
- my_blkdev_disk = alloc_disk(1);
- if(!my_blkdev_disk){
- ret = -ENOMEM;
- goto err_alloc_disk;
- }
- strcpy(my_blkdev_disk->disk_name,MY_BLKDEV_DISKNAME);
- my_blkdev_disk->major = MY_BLKDEV_DEVICEMAJOR;
- my_blkdev_disk->fops = & my_blkdev_fops;
- my_blkdev_disk->queue = my_blkdev_queue;
- set_capacity(my_blkdev_disk,MY_BLKDEV_SIZE>>9);
- add_disk(my_blkdev_disk);
- return 0;
- err_alloc_disk:
- blk_cleanup_queue(my_blkdev_queue);
- err_init_queue:
- return ret;
- }
- static void my_blkdev_exit(void)
- {
- printk(KERN_ALERT"exit modules blk!");
- del_gendisk(my_blkdev_disk);
- blk_cleanup_queue(my_blkdev_queue);
- }
- static void my_blkdev_do_request(struct request_queue *q)
- {
- struct request *req;
- while((req=blk_fetch_request(q))!=NULL){
- if((blk_rq_pos(req)+blk_rq_sectors(req))<<9 >MY_BLKDEV_SIZE){
- printk(KERN_ERR MY_BLKDEV_DISKNAME"bad request :block =%llu,count=%u\n",(u64) blk_rq_pos(req),blk_rq_sectors( req));
- __blk_end_request_all(req,-EIO);
- continue;
- }
- switch( rq_data_dir(req)){
- case READ:
- printk(KERN_ALERT "read\n");
- memcpy(req->buffer,my_blkdev_data+(blk_rq_pos(req)<<9),blk_rq_sectors(req)<<9);
- __blk_end_request_all(req,1);
- break;
- case WRITE:
- printk(KERN_ALERT "write\n");
- memcpy(my_blkdev_data+(blk_rq_pos(req)<<9),req->buffer,blk_rq_sectors(req)<<9);
- __blk_end_request_all(req,1); break;
- default:
- printk(KERN_ALERT "this should not happen");
- break;
- }
- }
- }
- module_init(my_blkdev_init);
- module_exit(my_blkdev_exit);
复制代码 |
|