亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: OstrichFly
打印 上一主題 下一主題

[原創(chuàng)] 寫一個塊設備驅動 [復制鏈接]

論壇徽章:
0
191 [報告]
發(fā)表于 2011-04-01 21:47 |只看該作者
樓主能做成一個pdf不?實在是上網沒時間。只能下載了看。

論壇徽章:
0
192 [報告]
發(fā)表于 2011-04-07 23:20 |只看該作者
看完了兩遍...今天自己動手就悲劇了...

畢竟是時間過去一段時間了  塊設備部分也有了變化,自己查了查,

然后編譯通過了  但是加載就悲劇····還是第一章····這不是打擊我積極性么····

樓主能給看看不....
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/blkdev.h>

  4. MODULE_LICENSE("Dual BSD/GPL");

  5. #define MY_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR
  6. #define MY_BLKDEV_DISKNAME "mydisk"
  7. #define MY_BLKDEV_SIZE (16*1024*1024)

  8. static struct request_queue *my_blkdev_queue;
  9. static struct gendisk *my_blkdev_disk;
  10. unsigned char my_blkdev_data[MY_BLKDEV_SIZE];

  11. static void my_blkdev_do_request(struct request_queue *q);

  12. struct block_device_operations my_blkdev_fops ={ .owner = THIS_MODULE,};

  13. static int __init my_blkdev_init(void )
  14. {
  15.    
  16.     int ret;
  17.     printk(KERN_ALERT MY_BLKDEV_DISKNAME"init!");
  18.     my_blkdev_queue = blk_init_queue(my_blkdev_do_request,NULL);
  19.     if(!my_blkdev_queue){
  20.         ret = -ENOMEM;
  21.         goto err_init_queue;
  22.     }
  23.     my_blkdev_disk = alloc_disk(1);
  24.     if(!my_blkdev_disk){
  25.         ret = -ENOMEM;
  26.         goto err_alloc_disk;
  27.     }
  28.     strcpy(my_blkdev_disk->disk_name,MY_BLKDEV_DISKNAME);
  29.     my_blkdev_disk->major = MY_BLKDEV_DEVICEMAJOR;
  30.     my_blkdev_disk->fops = & my_blkdev_fops;
  31.     my_blkdev_disk->queue = my_blkdev_queue;
  32.     set_capacity(my_blkdev_disk,MY_BLKDEV_SIZE>>9);
  33.     add_disk(my_blkdev_disk);
  34.     return 0;

  35. err_alloc_disk:
  36.     blk_cleanup_queue(my_blkdev_queue);

  37. err_init_queue:
  38.     return ret;

  39. }

  40. static void my_blkdev_exit(void)
  41. {

  42.         printk(KERN_ALERT"exit modules blk!");
  43.     del_gendisk(my_blkdev_disk);
  44.     blk_cleanup_queue(my_blkdev_queue);
  45. }

  46. static void my_blkdev_do_request(struct request_queue *q)
  47. {
  48.     struct request *req;
  49.     while((req=blk_fetch_request(q))!=NULL){
  50.         if((blk_rq_pos(req)+blk_rq_sectors(req))<<9 >MY_BLKDEV_SIZE){
  51.             printk(KERN_ERR MY_BLKDEV_DISKNAME"bad request :block =%llu,count=%u\n",(u64) blk_rq_pos(req),blk_rq_sectors( req));
  52.             __blk_end_request_all(req,-EIO);
  53.             continue;
  54.         }
  55.         switch( rq_data_dir(req)){
  56.             case READ:
  57.                 printk(KERN_ALERT "read\n");
  58.                 memcpy(req->buffer,my_blkdev_data+(blk_rq_pos(req)<<9),blk_rq_sectors(req)<<9);
  59.                 __blk_end_request_all(req,1);
  60.                 break;
  61.             case WRITE:
  62.                 printk(KERN_ALERT "write\n");
  63.                 memcpy(my_blkdev_data+(blk_rq_pos(req)<<9),req->buffer,blk_rq_sectors(req)<<9);
  64.                 __blk_end_request_all(req,1);                break;
  65.             default:
  66.                 printk(KERN_ALERT "this should not happen");
  67.                 break;
  68.         }
  69.     }
  70. }
  71. module_init(my_blkdev_init);
  72. module_exit(my_blkdev_exit);

復制代碼

論壇徽章:
0
193 [報告]
發(fā)表于 2011-04-07 23:24 |只看該作者
環(huán)境:ubuntu 10.04tls
內核 :2.6.36.2
gcc:4.4.3

論壇徽章:
0
194 [報告]
發(fā)表于 2011-04-08 20:39 |只看該作者
lz,我拿你第一章的代碼在我電腦上編譯,出現以下錯誤:
make -C /lib/modules/2.6.37.2+/build SUBDIRS=/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01 modules
make[1]: Entering directory `/usr/src/linux-2.6.37.2'
  CC [M]  /data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.o
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c: In function 'simp_blkdev_do_request':
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:43: error: implicit declaration of function 'elv_next_request'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:43: warning: assignment makes pointer from integer without a cast
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:44: error: 'struct request' has no member named 'sector'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:44: error: 'struct request' has no member named 'current_nr_sectors'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:48: error: 'struct request' has no member named 'sector'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:49: error: 'struct request' has no member named 'current_nr_sectors'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:50: error: implicit declaration of function 'end_request'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:57: error: 'struct request' has no member named 'sector'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:58: error: 'struct request' has no member named 'current_nr_sectors'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:62: error: 'struct request' has no member named 'sector'
/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.c:63: error: 'struct request' has no member named 'current_nr_sectors'
make[2]: *** [/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01/simp_blkdev.o] Error 1
make[1]: *** [_module_/data/home/likuo/blockdrive/simp_blkdev/simp_blkdev_step01] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.37.2'
make: *** [default] Error 2

我的內核是Linux-2.6.37.2
我于是在內核里找相應結構,發(fā)現struct request里沒有sector和current_nr_sectors成員,也沒發(fā)現elv_next_reques和end_request函數;
是不是它們改名字了,還是在哪地方弄錯了;
我是菜鳥,上網上也沒找到答案,請lz幫幫忙,謝謝

論壇徽章:
0
195 [報告]
發(fā)表于 2011-04-11 21:22 |只看該作者
回復 194# lilikoo


    改名字了   


具體看linux/include/blkdev.h

sectors    ------------- >   blk_rq_pos

nr_sectros   --------------- > blk_rq_sectors

__elv_next_request              -------------------->       blk_peek_request

論壇徽章:
0
196 [報告]
發(fā)表于 2011-04-13 19:29 |只看該作者
謝謝blinkkey,我改了一些地方:
sectors調用blk_rq_pos得到
current_nr_sectors調用blk_rq_sectors得到
elv_next_request換成blk_peek_request
end_request換成blk_end_request_cur
終于編譯成功了,太高興了;
于是我insmod simp_blkdev.ko;
悲劇了,機器宕了,自動重啟

論壇徽章:
0
197 [報告]
發(fā)表于 2011-04-27 14:58 |只看該作者
我也碰到樓上的問題,哪位大牛解釋一下原因啊,謝謝。。。

論壇徽章:
0
198 [報告]
發(fā)表于 2011-05-20 09:24 |只看該作者
一加載模塊就死機,什么原因?哪位給分析下,謝謝了。

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/blkdev.h>

  4. #define KERNEL_SECTOR_SIZE        512

  5. static int sbull_major = 0;
  6. static struct request_queue *request;
  7. static struct gendisk *gd;

  8. static int nsectors = (16*1024*1024) >> 9;
  9. static int hardsect_size = 512;

  10. unsigned char sbull_data[16*1024*1024];

  11. static struct block_device_operations sbull_fops = {
  12.         .owner        =        THIS_MODULE,
  13. };

  14. static void sbull_request(struct request_queue *q)
  15. {
  16.         int err;
  17.         struct request *req;
  18.         unsigned int sector, current_nr_sectors;
  19.        
  20.         req = blk_peek_request(q);
  21.         sector = blk_rq_pos(req);
  22.         current_nr_sectors = blk_rq_sectors(req);

  23.         switch (rq_data_dir(req)) {

  24.         case READ:
  25.                 memcpy(req->buffer, sbull_data + (sector << 9), current_nr_sectors << 9);
  26.                 blk_end_request_cur(req, err);
  27.                 break;

  28.         case WRITE:
  29.                 memcpy(sbull_data + (sector << 9), req->buffer, current_nr_sectors << 9);
  30.                 blk_end_request_cur(req, err);
  31.                 break;

  32.         default:
  33.                 break;
  34.         }
  35. }

  36. static int __init sbull_init(void)
  37. {
  38.         int ret;
  39.         sbull_major = register_blkdev(sbull_major, "sbull");
  40.         if (sbull_major <= 0) {               
  41.                 printk(KERN_WARNING "sbull: unable to get major number\n");                                                                                                      
  42.                 return -EBUSY;
  43.         }

  44.         /* I/O scheduler passes ordered requests to device driver through struct request_queue */
  45.         request = blk_init_queue(sbull_request, NULL);
  46.         if (!request) {
  47.                 ret = -ENOMEM;
  48.                 printk (KERN_NOTICE "blk_init_queue failure\n");
  49.                 goto err_init_queue;
  50.         }       

  51.         gd = alloc_disk(1);
  52.         if (!gd) {
  53.                 ret = -ENOMEM;
  54.                 printk (KERN_NOTICE "alloc_disk failure\n");
  55.                 goto err_alloc_disk;
  56.         }
  57.        
  58.         strcpy(gd->disk_name, "sbull");
  59.         gd->major = sbull_major;
  60.         gd->first_minor = 0;
  61.         gd->fops = &sbull_fops;
  62.         gd->queue = request;
  63.         set_capacity(gd, nsectors*(hardsect_size/KERNEL_SECTOR_SIZE));
  64.         add_disk(gd);
  65.        
  66.         return 0;

  67. err_alloc_disk:
  68.         blk_cleanup_queue(request);
  69. err_init_queue:
  70.         return ret;
  71. }

  72. static void __exit sbull_exit(void)
  73. {
  74.         del_gendisk(gd);
  75.         put_disk(gd);
  76.         blk_cleanup_queue(request);
  77. }

  78. module_init(sbull_init);
  79. module_exit(sbull_exit);
復制代碼

論壇徽章:
0
199 [報告]
發(fā)表于 2011-08-02 18:44 |只看該作者
本帖最后由 c04n05 于 2011-08-04 10:45 編輯

看到了第3章了。覺得非常不錯。
感謝LZ分享

我在fedora 9下面碰到了和193樓類似的問題。。悲劇。
BTW:給大家分享一個基樹的資料http://www.360doc.com/content/09/1017/08/313373_7396041.shtml

論壇徽章:
0
200 [報告]
發(fā)表于 2011-08-03 14:13 |只看該作者
把blk_end_request_cur 換成__blk_end_request_cur
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯網協會會員  聯系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP