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

Chinaunix

標(biāo)題: struct cdev 與struct device [打印本頁(yè)]

作者: 陳九CU    時(shí)間: 2013-06-04 17:33
標(biāo)題: struct cdev 與struct device
          這兩天看linux設(shè)備模型看得我稀里糊涂了。
在我以前看的資料中,通過(guò)inode的成員struct cdev *i_cdev找到字符設(shè)備,
字符設(shè)備中有struct kobject kobj;struct file_operation *ops;等成員;
file_operation里包含了所有操作文件(這里是設(shè)備文件)函數(shù)的指針。漏講了
主設(shè)備號(hào)和次設(shè)備號(hào)分別標(biāo)識(shí)驅(qū)動(dòng)程序和設(shè)備。感覺(jué)條理非常清楚。
       現(xiàn)在來(lái)了個(gè)linux設(shè)備模型。一下子就把我給打暈了,先是
struct cdev 和struct device,這兩個(gè)數(shù)據(jù)結(jié)構(gòu)我是認(rèn)為通過(guò)共享相同的kobject來(lái)
表示同一個(gè)設(shè)備,然后前者偏向于驅(qū)動(dòng)程序,后者偏向于設(shè)備管理(其實(shí)講到這點(diǎn)我就
已經(jīng)開(kāi)始暈頭轉(zhuǎn)向了,可能是在胡說(shuō)八道了)。
      更加重要的是,我在一個(gè)源碼中已經(jīng)找不到原來(lái)的操作/dev 目錄下設(shè)備文件的
file_operation數(shù)據(jù)結(jié)構(gòu)了,只能找到show,store這兩個(gè)操作屬性的函數(shù),屬性在sysfs
中表現(xiàn)為文件,你說(shuō)調(diào)個(gè)屏幕分辨率,調(diào)個(gè)音量可以用操作屬性文件的方向,那么傳輸數(shù)據(jù)
到LCD屏呢?也能用用show store函數(shù)?對(duì)于進(jìn)程來(lái)說(shuō),還是需要用read,write,ioctl函數(shù)吧。
還是需要操作 /dev下面的設(shè)備文件吧。可是我真的沒(méi)找在源代碼中找到第一段中講的任何代碼。
難道是設(shè)備模型幫我們做了這一切,請(qǐng)哪位好心人和我講解下。
   除非上面的這兩個(gè)問(wèn)題,struct device 和struct cdev的區(qū)別與聯(lián)系,以及/dev文件的操
作代碼外,還有好多問(wèn)題,暫時(shí)就不貼出來(lái)了。估計(jì)回答了一兩個(gè)就能都理解了吧。
   一百萬(wàn)分感謝
作者: 時(shí)間看來(lái)    時(shí)間: 2013-06-05 10:10
struct device 和struct cdev的區(qū)別與聯(lián)系:
我的理解是,Linux設(shè)備模型的低級(jí)部分(kobject,kset,subsystem)相當(dāng)于“基類(lèi)”,sysfs表述是他們的功能之一;Linux設(shè)備模型的高級(jí)部分(bus,device,device_driver)中,device,cdev是“子類(lèi)”。net_device中包含了device結(jié)構(gòu)。但是塊設(shè)備結(jié)構(gòu)gendisk中,我沒(méi)有找到device或者kobject,只有他們的指針???哎,搞不懂……
作者: asuka2001    時(shí)間: 2013-06-05 19:29
1. bus. device. device_driver:

面向的需求:更傾向于設(shè)備“物理”的一面,我們關(guān)心設(shè)備是通過(guò)什么總線連接進(jìn)系統(tǒng),怎樣進(jìn)行設(shè)備的電源管理,怎么樣來(lái)處理設(shè)備的熱插拔,怎么樣從用戶(hù)空間來(lái)獲取這些信息。這一切的一切,跟設(shè)備的功能不相關(guān),你在PCI總線上,我就認(rèn)為你是PCI設(shè)備,管你是網(wǎng)卡還是顯卡,還是啥其他的東西。

面向的用戶(hù):更多直接和它們打交道的,是內(nèi)核中的其他子系統(tǒng),而不是真正的用戶(hù)空間的程序。一般不同syscall打交道:如各種總線控制器,用戶(hù)空間完全無(wú)法訪問(wèn),或者向cdev, block_device, net_device提供服務(wù),間接服務(wù)于用戶(hù)空間的程序。


2. cdev, block_device, net_device:

面向的需求:對(duì)于用戶(hù)空間的程序而言,更大程度上期待的是設(shè)備的“功能”:我不管你是PCI設(shè)備還是USB設(shè)備,我只認(rèn)你是網(wǎng)卡,你就得讓我上網(wǎng);是顯卡,就得讓我玩3D游戲;是U盤(pán),你就得給我存數(shù)據(jù)。

面向的用戶(hù):毫無(wú)疑問(wèn),向用戶(hù)空間的程序提供指定的功能;如 open(), read(), write(), close(), ioctl()或socket(),send(),recv()等。。。一般直接向syscall負(fù)責(zé)(會(huì)通過(guò)VFS中轉(zhuǎn))
作者: asuka2001    時(shí)間: 2013-06-05 19:52
本帖最后由 asuka2001 于 2013-06-05 20:32 編輯

以MTD設(shè)備為例吧:

driver/mtdchar.c向用戶(hù)空間注冊(cè)設(shè)備節(jié)點(diǎn),如/dev/mtd0,提供 struct file_operations mtd_fops。它是cdev,它提供的功能必須依賴(lài)于實(shí)際的物理設(shè)備 device,即 struct mtd_info (mtd_info有成員 struct device dev)。

從/dev/mtd0到struct mtd_info的映射是由設(shè)備節(jié)點(diǎn)號(hào)來(lái)完成,內(nèi)核在mtdchar_open()中調(diào)用mtd = get_mtd_device(NULL, devnum);來(lái)完成此映射。

mtd_info通過(guò)自身的接口,如
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);
.....................
}
來(lái)實(shí)際操作物理設(shè)備,假設(shè)是nand flash。mtd_info后面又要通過(guò)成員變量 priv映射到 struct nand_chip,通過(guò)它的成員方法

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);
.........................
}
來(lái)最終將來(lái)自用戶(hù)空間的需求轉(zhuǎn)換為實(shí)際的設(shè)備操作。

而這些/dev/mtd0 --> mtd_info --> nand_chip映射,是通過(guò)注冊(cè)設(shè)備時(shí)設(shè)定好的。

作者: 鬼鬼一哈    時(shí)間: 2013-06-05 22:08
但是塊設(shè)備結(jié)構(gòu)gendisk中,我沒(méi)有找到device或者kobject,只有他們的指針???哎,搞不懂……
gendisk是通用塊層的東西,他只用負(fù)載從文件系統(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://72891.cn/) Powered by Discuz! X3.2