亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
struct cdev 與struct device
[打印本頁]
作者:
陳九CU
時間:
2013-06-04 17:33
標(biāo)題:
struct cdev 與struct device
這兩天看linux設(shè)備模型看得我稀里糊涂了。
在我以前看的資料中,通過inode的成員struct cdev *i_cdev找到字符設(shè)備,
字符設(shè)備中有struct kobject kobj;struct file_operation *ops;等成員;
file_operation里包含了所有操作文件(這里是設(shè)備文件)函數(shù)的指針。漏講了
主設(shè)備號和次設(shè)備號分別標(biāo)識驅(qū)動程序和設(shè)備。感覺條理非常清楚。
現(xiàn)在來了個linux設(shè)備模型。一下子就把我給打暈了,先是
struct cdev 和struct device,這兩個數(shù)據(jù)結(jié)構(gòu)我是認為通過共享相同的kobject來
表示同一個設(shè)備,然后前者偏向于驅(qū)動程序,后者偏向于設(shè)備管理(其實講到這點我就
已經(jīng)開始暈頭轉(zhuǎn)向了,可能是在胡說八道了)。
更加重要的是,我在一個源碼中已經(jīng)找不到原來的操作/dev 目錄下設(shè)備文件的
file_operation數(shù)據(jù)結(jié)構(gòu)了,只能找到show,store這兩個操作屬性的函數(shù),屬性在sysfs
中表現(xiàn)為文件,你說調(diào)個屏幕分辨率,調(diào)個音量可以用操作屬性文件的方向,那么傳輸數(shù)據(jù)
到LCD屏呢?也能用用show store函數(shù)?對于進程來說,還是需要用read,write,ioctl函數(shù)吧。
還是需要操作 /dev下面的設(shè)備文件吧?墒俏艺娴臎]找在源代碼中找到第一段中講的任何代碼。
難道是設(shè)備模型幫我們做了這一切,請哪位好心人和我講解下。
除非上面的這兩個問題,struct device 和struct cdev的區(qū)別與聯(lián)系,以及/dev文件的操
作代碼外,還有好多問題,暫時就不貼出來了。估計回答了一兩個就能都理解了吧。
一百萬分感謝
作者:
時間看來
時間:
2013-06-05 10:10
struct device 和struct cdev的區(qū)別與聯(lián)系:
我的理解是,Linux設(shè)備模型的低級部分(kobject,kset,subsystem)相當(dāng)于“基類”,sysfs表述是他們的功能之一;Linux設(shè)備模型的高級部分(bus,device,device_driver)中,device,cdev是“子類”。net_device中包含了device結(jié)構(gòu)。但是塊設(shè)備結(jié)構(gòu)gendisk中,我沒有找到device或者kobject,只有他們的指針???哎,搞不懂……
作者:
asuka2001
時間:
2013-06-05 19:29
1. bus. device. device_driver:
面向的需求:更傾向于設(shè)備“物理”的一面,我們關(guān)心設(shè)備是通過什么總線連接進系統(tǒng),怎樣進行設(shè)備的電源管理,怎么樣來處理設(shè)備的熱插拔,怎么樣從用戶空間來獲取這些信息。這一切的一切,跟設(shè)備的功能不相關(guān),你在PCI總線上,我就認為你是PCI設(shè)備,管你是網(wǎng)卡還是顯卡,還是啥其他的東西。
面向的用戶:更多直接和它們打交道的,是內(nèi)核中的其他子系統(tǒng),而不是真正的用戶空間的程序。一般不同syscall打交道:如各種總線控制器,用戶空間完全無法訪問,或者向cdev, block_device, net_device提供服務(wù),間接服務(wù)于用戶空間的程序。
2. cdev, block_device, net_device:
面向的需求:對于用戶空間的程序而言,更大程度上期待的是設(shè)備的“功能”:我不管你是PCI設(shè)備還是USB設(shè)備,我只認你是網(wǎng)卡,你就得讓我上網(wǎng);是顯卡,就得讓我玩3D游戲;是U盤,你就得給我存數(shù)據(jù)。
面向的用戶:毫無疑問,向用戶空間的程序提供指定的功能;如 open(), read(), write(), close(), ioctl()或socket(),send(),recv()等。。。一般直接向syscall負責(zé)(會通過VFS中轉(zhuǎn))
作者:
asuka2001
時間:
2013-06-05 19:52
本帖最后由 asuka2001 于 2013-06-05 20:32 編輯
以MTD設(shè)備為例吧:
driver/mtdchar.c向用戶空間注冊設(shè)備節(jié)點,如/dev/mtd0,提供 struct file_operations mtd_fops。它是cdev,它提供的功能必須依賴于實際的物理設(shè)備 device,即 struct mtd_info (mtd_info有成員 struct device dev)。
從/dev/mtd0到struct mtd_info的映射是由設(shè)備節(jié)點號來完成,內(nèi)核在mtdchar_open()中調(diào)用mtd = get_mtd_device(NULL, devnum);來完成此映射。
mtd_info通過自身的接口,如
struct mtd_info {
....................
int (*_read) (struct mtd_info *mtd, loff_t from, size_t len,
size_t *retlen, u_char *buf);
int (*_write) (struct mtd_info *mtd, loff_t to, size_t len,
size_t *retlen, const u_char *buf);
.....................
}
來實際操作物理設(shè)備,假設(shè)是nand flash。mtd_info后面又要通過成員變量 priv映射到 struct nand_chip,通過它的成員方法
struct nand_chip {
.........................
void (*read_buf)(struct mtd_info *mtd, uint8_t *buf, int len);
void (*erase_cmd)(struct mtd_info *mtd, int page);
int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,
const uint8_t *buf, int oob_required, int page,
int cached, int raw);
.........................
}
來最終將來自用戶空間的需求轉(zhuǎn)換為實際的設(shè)備操作。
而這些/dev/mtd0 --> mtd_info --> nand_chip映射,是通過注冊設(shè)備時設(shè)定好的。
作者:
鬼鬼一哈
時間:
2013-06-05 22:08
但是塊設(shè)備結(jié)構(gòu)gendisk中,我沒有找到device或者kobject,只有他們的指針???哎,搞不懂……
gendisk是通用塊層的東西,他只用負載從文件系統(tǒng)下發(fā)的指令,因此gd->fops = &sd_fops;以scsi設(shè)備為例,
scsi_disk->disk = gd;
struct scsi_device
struct scsi_disk
struct gendisk三者的關(guān)系你就明白了。
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2