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

  免費(fèi)注冊 查看新帖 |

Chinaunix

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

[原創(chuàng)] 寫一個塊設(shè)備驅(qū)動 [復(fù)制鏈接]

論壇徽章:
0
201 [報告]
發(fā)表于 2011-08-17 14:26 |只看該作者
謝謝樓主

論壇徽章:
0
202 [報告]
發(fā)表于 2011-08-17 14:28 |只看該作者
還有作者其他的文章嗎

論壇徽章:
0
203 [報告]
發(fā)表于 2011-09-04 18:32 |只看該作者
mkfs.ext3 失敗,我是在板子里面運(yùn)行的,沒有這個命令。有什么辦法達(dá)到相同的效果嗎,掛載不了

論壇徽章:
0
204 [報告]
發(fā)表于 2011-10-27 16:47 |只看該作者

論壇徽章:
0
205 [報告]
發(fā)表于 2011-10-29 00:31 |只看該作者
好好學(xué)習(xí)樓主作品

論壇徽章:
0
206 [報告]
發(fā)表于 2011-10-29 00:33 |只看該作者
好好學(xué)習(xí)樓主作品

論壇徽章:
0
207 [報告]
發(fā)表于 2011-10-30 11:55 |只看該作者
學(xué)習(xí)了

論壇徽章:
0
208 [報告]
發(fā)表于 2011-12-07 13:05 |只看該作者
回復(fù) 192# blindkey

我和你遇到的問題基本一樣,insmod就死機(jī)。。哎 你解決了嗎?

論壇徽章:
0
209 [報告]
發(fā)表于 2011-12-09 09:50 |只看該作者
回復(fù) 1# OstrichFly


    樓主好,看了您的第一章,將例子實(shí)踐了下,但不成功,剛?cè)腴T,調(diào)了一天,不知道怎么辦了。
我的環(huán)境如下:

ubuntu 10.04 2.6.32-33-generic

.c
  1. #include<linux/init.h>
  2. #include<linux/module.h>
  3. #include<linux/genhd.h>
  4. #include<linux/fs.h>
  5. #include<linux/blkdev.h>

  6. #define SIMP_BLKDEV_DISKNAME "simp_blkdev"
  7. #define SIMP_BLKDEV_DEVICEMAJOR COMPAQ_SMART2_MAJOR
  8. #define SIMP_BLKDEV_BYTES (8*1024*1024)



  9. static DEFINE_SPINLOCK(rq_lock);
  10. unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES];
  11. static struct gendisk *simp_blkdev_disk;
  12. static struct request_queue *simp_blkdev_queue;//device's request queue

  13. struct block_device_operations simp_blkdev_fops = {
  14.         .owner = THIS_MODULE,
  15. };
  16. //handle request that pass to this device
  17. static void simp_blkdev_do_request(struct request_queue *q){
  18.         struct request *req;
  19.         while( (req = blk_fetch_request(q)) != NULL){
  20.                 if( ( (blk_rq_pos(req) + blk_rq_cur_sectors(req))<<9) > SIMP_BLKDEV_BYTES ){
  21.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":bad request: block=%llu, count=%u\n",(
  22.                                 unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
  23.                         blk_end_request_all(req,-1);
  24.                         continue;
  25.                 }
  26.                

  27.                 switch( rq_data_dir(req)){
  28.                 case READ:
  29.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME ":read request: block=%llu, count=%u\n",(
  30.                                 unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
  31.                         memcpy(req->buffer,(char *)(simp_blkdev_data + (blk_rq_pos(req)<<9)),blk_rq_cur_bytes(req));
  32.                         blk_end_request_all(req,0);
  33.                         break;
  34.                 case WRITE:
  35.                         printk(KERN_ERR SIMP_BLKDEV_DISKNAME ": write request: block=%llu, count=%u\n",(
  36.                                 unsigned long long )blk_rq_pos(req),blk_rq_cur_sectors(req));
  37.                         memcpy((char *)(simp_blkdev_data + (blk_rq_pos(req)<<9)),req->buffer,blk_rq_cur_bytes(req));
  38.                         blk_end_request_all(req,0);
  39.                         break;
  40.                 }
  41.         }
  42. }

  43. static int simp_blkdev_init(void){
  44.         int ret;
  45.         //init the request queue by the handler function
  46.         simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,&rq_lock);
  47.         if(!simp_blkdev_queue){
  48.                 ret = -ENOMEM;
  49.                 goto error_init_queue;
  50.         }
  51.         //alloc the resource of gendisk
  52.         simp_blkdev_disk = alloc_disk(1);
  53.         if(!simp_blkdev_disk){
  54.                 ret = -ENOMEM;
  55.                 goto error_alloc_disk;
  56.         }
  57.        

  58.         //populate the gendisk structure
  59.         strcpy(simp_blkdev_disk->disk_name,SIMP_BLKDEV_DISKNAME);
  60.         simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR;
  61.         simp_blkdev_disk->first_minor = 0;
  62.         simp_blkdev_disk->fops = &simp_blkdev_fops;
  63.         simp_blkdev_disk->queue = simp_blkdev_queue;
  64.         set_capacity(simp_blkdev_disk,SIMP_BLKDEV_BYTES>>9);
  65.        
  66.         add_disk(simp_blkdev_disk);
  67.         printk("module simp_blkdev added.\n");
  68.         return 0;

  69. error_init_queue:
  70.         blk_cleanup_queue(simp_blkdev_queue);

  71. error_alloc_disk:
  72.         return ret;       

  73. }
  74. static void simp_blkdev_exit(void){
  75.         del_gendisk(simp_blkdev_disk);
  76.         put_disk(simp_blkdev_disk);
  77.         blk_cleanup_queue(simp_blkdev_queue);
  78.         printk("module simp_blkdev romoved.\n");
  79. }



  80. module_init(simp_blkdev_init);
  81. module_exit(simp_blkdev_exit);
復(fù)制代碼
Makefile
  1. obj-m := simp_blkdev.o
  2. KDIR = /lib/modules/$(shell uname -r)/build

  3. all:
  4.         $(MAKE) -C $(KDIR) M=$(PWD)

  5. .PHONY:clean
  6. clean:
  7.         rm -f *.mod.c *.mod.o *.ko *.o *.tmp_versions *.markers *.symvers *.order
復(fù)制代碼
這樣insmod后直接死機(jī)。。。

如果去掉blk_end_request_all(req,0)  可以insmod,但是不能夠rmmod ,報錯“module simp_blkdev in use”。

我去參考了2.6.32內(nèi)核的z2ram.c,但是也沒有解決問題。?偢杏X它的代碼里面沒有end_request這個步驟。


謝謝大大指導(dǎo)了 。!

論壇徽章:
0
210 [報告]
發(fā)表于 2011-12-15 12:24 |只看該作者
慢慢看,努力看懂,呵呵!
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP