設備節點的說明

用戶態經過mknod創建文件,VFS負責把它索引到對應的inode上,讓它和特定驅動關聯。用戶態調用open的時候,VFS再建立一個filep,並一塊兒傳遞給那個驅動(register_chrdev的那個驅動),那個驅動自己有全部調用的回調,也能夠給filp創建另外一套回調,無所謂,以後其餘調用就直接能夠指向設備自己了。node

這個應該回答原題的問題了。linux

而後回答動態模塊的問題:數組

內核的動態模塊原理和so的原理徹底同樣,加載的時候同時展開代碼段和數據段,但實施上有所不一樣,so是lazy加載,沒有用到的時候不會真正加載到內存中,但內核是真正加載。函數

ko中的全局變量,和非ko的全局變量同樣,在模塊加載後就一直在系統中。spa

不存在「重要模塊」,模塊是否加載,都是init程序的配置引發的,若是init初始化樹中沒有加載動態模塊,就不會有任何動態模塊加載到系統中。debug

一般動態模塊不會「掃描」設備,動態模塊只會「驅動」設備。好比你有一個平臺設備的ko,你加載進去了,init_module中註冊到platform_bus子系統中,platform_bus子系統會在註冊的時候用match函數給你match一次全部當初有人報過給它的全部device,若是device和你的註冊match,就會產生probe(),但你的驅動無權主動去掃描硬件的。反過來,若是是你的驅動先註冊,真正的設備後插入(好比USB key),這個事情會同樣發生。最終仍是match,而後probe。指針

mknod建立的文件是「設備文件」,區別與「普通文件」。
1: 設備驅動創建了這個設備node,這個Node 是設備文件,mknod時 程序使用設備的一個「接口」,經過此「接口」你能夠訪問到它指向的具體設備。若是你沒有moknod ,在linux的「一切皆文件」的思想下,你怎麼才能訪問使用你的設備呢? 因此,「爲設備創建一個文件吧」
2:當程序調用 open打開這 /dev/demon 的「文件時」, 此時的open僅僅是在VFS(虛擬文件系統)層面的open, VFS會在內存中建立一個 file_struct的結構,並返回一個fd, 其實fd 是和這個file_struct相關聯的:
好比在進程的files_struct結構中,有fd數組和fd_array數據,fd存放文件描述符,fd_array存放進程打開的 file_struct, 其中每一個fd 指向fd_array中的一個元素。

3:fd_array中的存放的 是file_struct,每一個file_struct結構中都 有一個類型爲file_operations畢結構的指針f_op,f_op指向了一組 能夠對文件進行的操做的函數(好比read)。當真正對文件進行操做時(好比read),f_op指向的操做函數(read)會調用 「針對該文件所屬的類型"的具體的真正的函數來執行操做。(好比:ext3_read() /MS_dos_read()).orm

因此對demon進行操做時,fd 和file_struct 最後仍是 指向 了你所 建立的 demon表明的設備。索引

在一切皆文件的思路下,設備文件/dev/demon 能夠理解爲「你的設備在VSF中的一個符號連接(VFS的inode,設備文件沒有相應的磁盤inode(我在rhel6.5 x86_64:2.6.32-431環境下debugfs 看不到/dev下面文件的索引節點號),而普通的文件在磁盤是有inode的)」,當Open時,VSF爲該inode(/dev/demon) 建立對應的 VSF的file_struct,以及fd。接口

fd和 file_struct 只是在你open設備時,在內存中建立, 能夠把fd/file_struct 理解成 「你的設備在內存中的映射」。

inode 節點——> 文件在內核態中的fs中的描述結構,和具體文件系統類型無關,不屬於哪個進程,在內核的生命週期中一直存在於內存中,表明文件的實體。。。 file ——> 文件在進程中的描述符,隨着進程死亡而被釋放。。 fd ——> 爲了封裝file的複雜性,提供給用戶在進程中索引file的一個索引號,fd只是打開的file的一個索引,進程真正操做的文件結構是file。。。。。 橋接模式——> 也叫handle/body模式,Linux在file與inode直接模仿了橋接模式,只有open以後,file才與具體的inode橋接起來,互相通訊,一旦close,或者進程死亡,file能夠消失,inode卻隨內核繼續存在。經過橋接的隔離,file與inode能夠分開進行各自的抽象和衍生,inode的組成元素有cdev, block_dev 等,於是向下能夠管理操做各類字符設備,塊設備。。。 mknod——>本質上是在/dev目錄下建立一個inode節點,/dev目錄通常有一個devtmpfs或者udevfs掛在在上面,也就是說mknod本質上就是建立/dev目錄下的inode節點,建立過程當中,傳入的設備號,使得inode節點能在Linux內核中相關的註冊鏈表裏夠找到對應的cdev或者block_dev結構體橋接起來。。。 再回到橋接模式——> file——>inode ——> cdev/block_device 中間能夠當作兩個橋接,open使得file與inode橋接起來,mknod使得inode和cdev/block_device橋接起來,每一個部分均可以獨自抽象衍生,和其它部分無關,只要調用的時候橋接起來就行。。。

相關文章
相關標籤/搜索