最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

全知乎獨一無二的Linux設(shè)備模型(一)(超詳細)

2022-04-01 20:27 作者:補給站Linux內(nèi)核  | 我要投稿
  • 隨著計算機的周邊外設(shè)越來越豐富,設(shè)備管理已經(jīng)成為現(xiàn)代操作系統(tǒng)的一項重要任務(wù),這對于Linux來說也是同樣的情況。每次Linux內(nèi)核新版本的發(fā)布,都會伴隨著一批設(shè)備驅(qū)動進入內(nèi)核。在Linux內(nèi)核里,驅(qū)動程序的代碼量占有了相當大的比重。下圖是我在網(wǎng)絡(luò)上搜索到的一幅Linux內(nèi)核代碼量的統(tǒng)計圖,對應(yīng)的內(nèi)核版本是2.6.29。


  • 我們可以很明顯的看到,在Linux內(nèi)核中驅(qū)動程序的比例已經(jīng)非常高了。

  • Linux 2.6內(nèi)核最初為了應(yīng)付電源管理的需要,提出了一個設(shè)備模型來管理所有的設(shè)備。在物理上,外設(shè)之間是有一種層次關(guān)系的,比如把一個U盤插到筆記本上,實際上這個U盤是接在一個USB Hub上,USB Hub又是接在USB 2.0 Host Controller (EHCI)上,最終EHCI又是一個掛在PCI Bus上的設(shè)備。這里的一個層次關(guān)系是:PCI->EHCI->USB Hub->USB Disk。如果操作系統(tǒng)要進入休眠狀態(tài),首先要逐層通知所有的外設(shè)進入休眠模式,然后整個系統(tǒng)才可以休眠。因此,需要有一個樹狀的結(jié)構(gòu)可以把所有的外設(shè)組織起來。這就是最初建立Linux設(shè)備模型的目的。

  • 當然,Linux設(shè)備模型給我們帶來的便利遠不止如此。既然已經(jīng)建立了一個組織所有設(shè)備和驅(qū)動的樹狀結(jié)構(gòu),用戶就可以通過這棵樹去遍歷所有的設(shè)備,建立設(shè)備和驅(qū)動程序之間的聯(lián)系,根據(jù)類型不同也可以對設(shè)備進行歸類,這樣就可以更清晰的去“看”這顆枝繁葉茂的大樹。另外,Linux驅(qū)動模型把很多設(shè)備共有的一些操作抽象出來,大大減少了重復(fù)造輪子的可能。同時Linux設(shè)備模型提供了一些輔助的機制,比如引用計數(shù),讓開發(fā)者可以安全高效的開發(fā)驅(qū)動程序。達成了以上這些好處之后,我們還得到了一個非常方便的副產(chǎn)品,這就是sysfs----一個虛擬的文件系統(tǒng)。sysfs給用戶提供了一個從用戶空間去訪問內(nèi)核設(shè)備的方法,它在Linux里的路徑是/sys。這個目錄并不是存儲在硬盤上的真實的文件系統(tǒng),只有在系統(tǒng)啟動之后才會建起來。

  • 下面這個命令可以用來顯示sysfs的大致結(jié)構(gòu):

tree /sys

  • 這個命令的信息量非常大,我就不貼出來了,如果有興趣的話可以看看這里,或者自己動手實驗一下。

  • 我們來看看第一層目錄結(jié)構(gòu):

/sys?

|-- block?

|-- bus?

|-- class?

|-- dev?

|-- devices?

|-- firmware?

|-- fs?

|-- kernel?

|-- module?

`-- power


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!前100名進群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)?

  • 這里有10個子目錄,但并不是說這10個目錄代表了10種完全不同的設(shè)備類型,實際上這些目錄只是給我們提供了如何去看整個設(shè)備模型的不同的視角。其實從不同的目錄出發(fā)都有可能找到同一個設(shè)備的。那真正的設(shè)備信息到底放在哪里呢?看看目錄的名稱就應(yīng)該能猜到,對,就是devices子目錄,Linux的所有設(shè)備都可以在這個目錄里找到。這里是一個大雜燴,雖然五臟俱全但我們卻無從下手。這里還是以U盤為例,插上U盤之后,在devices目錄里如何找到這支U盤呢?真得很難辦到。但是如果知道這個U盤在系統(tǒng)里的設(shè)備文件名(暫且假設(shè)為sdb),那就可以從block目錄著手。

  • 透過block目錄,我們很容易就可以找到這個U盤設(shè)備,符號鏈接device正是指向devices目錄下的位置。

  • 到這里,我們總結(jié)一下/sys目錄下各個子目錄的作用。block目錄是從塊設(shè)備的角度來組織設(shè)備;bus目錄是從系統(tǒng)總線這個角度來組織設(shè)備,比如PCI總線或者USB總線;class目錄把看問題的視角提高到了類別的高度,比如PCI設(shè)備或者USB設(shè)備等;dev目錄的視角是設(shè)備節(jié)點;devices目錄在前面提到了,這里是所有設(shè)備的大本營;firmware目錄包含了一些比較低階的子系統(tǒng),比如ACPI、EFI等;fs目錄里看到的是系統(tǒng)支持的所有文件系統(tǒng);kernel目錄下包含的是一些內(nèi)核的配置選項;modules目錄下包含的是所有內(nèi)核模塊的信息,內(nèi)核模塊實際上和設(shè)備之間是有對應(yīng)關(guān)系的,通過這個目錄順藤摸瓜找到devices或者反過來都是可以做到的;power目錄存放的是系統(tǒng)電源管理的數(shù)據(jù),用戶可以通過它來查詢目前的電源狀態(tài),甚至可以直接“命令”系統(tǒng)進入休眠等省電模式。

  • sysfs正是用戶和內(nèi)核設(shè)備模型之間的一座橋梁,通過這個橋梁我們可以從內(nèi)核中讀取信息,也可以向內(nèi)核里寫入信息。

  • 在Linux里也可以找到一些圖形化的工具來查詢設(shè)備信息。比如GNOME下基于HAL的Device Manager:

  • 或者KDE下基于Solid的KInfoCenter:

  • 這些圖形化的工具提供了更加直觀的方式來訪問設(shè)備,但是它們的提供的信息還不夠全面,而且沒有向內(nèi)核設(shè)備寫數(shù)據(jù)的功能。

  • 如果具體到某一類型的設(shè)備,Linux下還有一些專用的工具可以使用。比如面向PCI設(shè)備的pciutils,面向USB設(shè)備的usbutils,以及面向SCSI設(shè)備的lsscsi等。對于Linux開發(fā)者來說,有時使用這些專用的工具更加方便。

  • 我們?nèi)绻獙懗绦騺碓L問sysfs,可以像讀寫普通文件一樣來操作/sys目錄下的文件,或者,也可以使用libsysfs。不過需要注意的是,Linux內(nèi)核社區(qū)并不推薦用libsysfs,因為這個API的更新不夠快,趕不上內(nèi)核的變化。libsysfs已經(jīng)逐漸背離最初創(chuàng)建它的目標,這個lib帶來的問題似乎比它解決的還要多。當然,如果只是要訪問設(shè)備,一般很少會直接操作sysfs,它太細節(jié)太底層了,大部分情況下可以使用更加方便的DeviceKit或者libudev。



全知乎獨一無二的Linux設(shè)備模型(一)(超詳細)的評論 (共 條)

分享到微博請遵守國家法律
贞丰县| 伊吾县| 页游| 河南省| 磴口县| 峡江县| 金湖县| 措勤县| 敦化市| 民丰县| 新乡县| 广德县| 开江县| 西贡区| 黄大仙区| 镇雄县| 九龙县| 定陶县| 延寿县| 陈巴尔虎旗| 广饶县| 张掖市| 镇康县| 雅江县| 阿瓦提县| 鹤壁市| 墨玉县| 汉沽区| 象山县| 桦甸市| 台江县| 寿阳县| 巢湖市| 洛浦县| 竹山县| 木兰县| 清涧县| 阳泉市| 观塘区| 增城市| 贡觉县|