這幾天在備課驅動程式的實驗課block device
參考的範例是Linux Device Driver的第16章 block device

雖然暑假學長上過一次課,並已知做出來的ramdisk (sbull)在新一點的Linux無法磁碟分割
但是心裡還是很不甘願,嘗試了幾種方法,發現原因似乎是跟Linux核心版本有關

於是用了關鍵字HDIO_GETGEOLXR找,突然間發現2.6.11跟2.6.23找出來結果不一樣
迅速翻了2.6.23哪邊用到了HDIO_GETGEO,眼睛一亮@.@
在block/ioctl.c中的int blkdev_ioctl()用到了!!
稍微看了一下,發現它呼叫了
ret = disk->fops->getgeo(bdev, &geo);

瞎猜應該是blkdev_ioctl攔截了HDIO_GETGEO指令,改呼叫getgeo所指定的函式

死馬當活馬醫,不囉唆,馬上為我們的sbull driver加上getgeo這個operation
並實做sbull_getgeo(),內容跟ioctlcase HDIO_GETGEO一模一樣

編譯、掛模組、用sfdisk檢查sbull,
$ sudo sfdisk -g /dev/sbull
YES!!總算沒有出現錯誤訊息了!!

看來是完成了~~
呼~總算沒有前後都死,做出來的東西都不能用,這樣太遜了

檢視了一下,這個改變似乎是2.6.16開始的!
而且從2.6.27開始,include/linux/blkdev.h拿掉了request_queue_t
必須使用struct request_queue
另外就是新增了一個dev_name函式,所以device name的全域變數不能再叫dev_name了Orz

最後,發現很有趣的一點就是,為甚麼
cylinder會是312??
我知道C*H*S = 20000 (sector數)
可是書上範例是拿size下去除,而不是拿sector下去除耶,
想不透的情況下,把cylinder=...註解掉,沒想到還是正確的...冏
這問題,留著待解吧!!

 

關鍵字:HDIO_GETGEO, 硬碟分割, sbull, Linux device driver

 

arrow
arrow
    全站熱搜

    koukaipan 發表在 痞客邦 留言(2) 人氣()