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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 8548 | 回復(fù): 4
打印 上一主題 下一主題

[硬件及驅(qū)動] struct cdev 與struct device [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-06-04 17:33 |只看該作者 |倒序瀏覽
          這兩天看linux設(shè)備模型看得我稀里糊涂了。
在我以前看的資料中,通過inode的成員struct cdev *i_cdev找到字符設(shè)備,
字符設(shè)備中有struct kobject kobj;struct file_operation *ops;等成員;
file_operation里包含了所有操作文件(這里是設(shè)備文件)函數(shù)的指針。漏講了
主設(shè)備號和次設(shè)備號分別標識驅(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文件的操
作代碼外,還有好多問題,暫時就不貼出來了。估計回答了一兩個就能都理解了吧。
   一百萬分感謝

論壇徽章:
0
2 [報告]
發(fā)表于 2013-06-05 10:10 |只看該作者
struct device 和struct cdev的區(qū)別與聯(lián)系:
我的理解是,Linux設(shè)備模型的低級部分(kobject,kset,subsystem)相當于“基類”,sysfs表述是他們的功能之一;Linux設(shè)備模型的高級部分(bus,device,device_driver)中,device,cdev是“子類”。net_device中包含了device結(jié)構(gòu)。但是塊設(shè)備結(jié)構(gòu)gendisk中,我沒有找到device或者kobject,只有他們的指針???哎,搞不懂……

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
3 [報告]
發(fā)表于 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負責(會通過VFS中轉(zhuǎn))

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
4 [報告]
發(fā)表于 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è)定好的。

論壇徽章:
0
5 [報告]
發(fā)表于 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)系你就明白了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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