Linux 核心中,對於字元裝置 塊裝置 匯流排 裝置 驅動等概念,如何正確理解?

時間 2021-05-06 11:00:55

1樓:chengfangYe

匯流排、裝置、驅動是整體組織管理裝置的框架,乙個kobject對應乙個/sys目錄下乙個目錄,乙個kobject_attribute對應乙個檔案,使用者層可以修改/sys檔案修改驅動引數。input、V4L2等是驅動框架,對應一類裝置比如platform_dev對應片內外設,V4L2對應攝像頭,frambuff對應顯示卡,滑鼠鍵盤等對應input;字元/塊/網路裝置分類是按裝置型別劃分;

2樓:Unbeliverpool

任何linux user層的操作都是對檔案的操作,之後陷入kernel,通過VFS訪問對應的驅動,也就是塊裝置/字元裝置驅動;塊裝置/字元裝置通過各種協議(I2C,mipi,spi等)訪問硬體。platform是一種虛擬匯流排,是為了管理裝置提出來的。舉個例子,platform下有i2c、block等;i2c下面有touchpanel,sensor等。

這樣在整體上就有乙個系統的樹形層次結構。input是另外一種分類,touchpanel,sensor等也掛載在input下面,因為他們既屬於I2C裝置,有屬於input裝置,沒有衝突的。I2C裝置說明使用了I2C匯流排,input裝置說明使用了input子系統,例如觸控螢幕(touchpanel)如下:

linux user態-->input子系統--->裝置驅動--->I2C匯流排--->硬體。

3樓:唐浩然

更新一下:

自己的一點新理解(可能與題主的 「站在應用的角度」不合,但如果真要在應用程式的角度,大多是不需要考慮裝置型別的,只需要關心作業系統抽象出來的介面就可以了。除非你的應用有自己的io管理,比如oracle的asm,作業系統只需要把系統識別到的原始裝置暴露給oracle,並把裝置的屬主給oracle,oracle會有自己的抽象層來對原始裝置進行管理自己完成和自己上層應用的互動):

@in nek 曾提到的我們受到國內教材的毒害(字元裝置的順序訪問,塊裝置的隨機訪問 ),國外好像也是這樣的教材:

a: 先貼乙個 quora 的大家看一下:https://www.

b: 國外也強調字元裝置的線性訪問 ,見wiki上面的說法:

Device file

順便提一下關於 block devices最後一段的內容:

「Most systems create both block and character devices to represent hardware like hard disks. FreeBSD and Linux notably do not; the former has removed support for block devices,

while the latter creates only block devices. In Linux, to get a character device for a disk one must use the "raw" driver, though one can get the same effect as opening a character device by opening the block device with the Linux-specific O_DIRECT flag.」

大體翻譯一下: 多數系統為代表性的硬體既建立塊裝置(檔案)也建立字元裝置(檔案)比如硬碟,freebsd 和linux沒這樣做,前者移除了對塊裝置的支援,而後者則僅僅為硬碟建立塊裝置(檔案),在linux中,想以字元裝置來使用硬碟 ,必須使用"raw" driver(記不記得安裝oracle 或RAC時,有時客戶會要求把硬碟作成raw式的字元裝置 ?),這樣就可以像操作字元裝置一樣開啟塊裝置(通過使用linux 特殊的操作 flag。

最近讀到,這個O_DERECT的標誌,就是在進行讀寫操作的時候,不使用作業系統的cache)。

個人理解為某些硬體是可以同時做成字元裝置和塊裝置的,不知 Linux中是RAM 是否在這些硬體之列。

c: 在另一本書中《深入理解Linux核心第三版》(此書以2.6核心為例,也提到2.

4核心作比較),也看到的提起 「字元裝置的順序訪問」: 並提到了作業系統為字元裝置建立迴圈緩衝: 也許,利用了緩衝應用程式才可以操作字元裝置進行lseek。

以下是原答案

1.在作業系統的角度,塊裝置/字元裝置/網路裝置都是io的一種,可以從這些裝置讀寫資料。

2.區別在於

a: 字元裝置最小的讀寫單位是乙個字元的長度-- 即兩個位元組(16位),這樣對我們造成的印象是當我們通過鍵盤輸入的時候或者是讀終端資料的時候,如果不考慮緩衝,資料可以每次以16個bit被送給字元裝置。 ( 原答案中我是這樣寫的,經知友in nek指正這樣說法存在錯誤:

字元裝置不能隨機讀寫,只能按順序讀寫,比如你依次在鍵盤輸入的內容,只會按你的輸入順序被系統接受。在比如作業系統向終端寫入資料,也是順序的在終端顯示。就像拿著碗喝豆漿,你只能從最上面的喝起,如果碗不漏的話。

)b:對於塊裝置, 最小的讀寫單位是乙個物理塊,對於磁碟來說是乙個扇區(一般來說是節),會給人造成「節,好大一堆字元組成的一塊啊」的印象,猜想由於這樣的特性被作業系統設計時定義成塊裝置 。(我的原答案:

塊裝置可以隨機讀寫,比如你可以讀寫系統下掛載的硬碟的任意位置的資料,就像吃一塊豆腐,你拿著刀可以吃這塊豆腐的任意部分。並且由於塊裝置的訪問速度太慢,讀寫一次(硬碟)的cpu等待時間太長,系統會為塊裝置在記憶體設立緩衝區,先把要寫入硬碟的資料寫入緩衝區,等滿足一定條件時一併寫入硬碟。)

c: 匯流排裝置是連線各種裝置的橋梁,比如lspci -t可以看到pci匯流排的裝置連線樹,匯流排裝置負責把塊裝置/字元裝置/網路裝置 /cpu /內存在硬體上是連通的,這樣當cpu發出指令「從硬碟的某個地方讀多少資料並把這些資料寫到終端」,「把鍵盤輸入的內容寫入到網絡卡」的時候,這些資料會通過匯流排被傳輸。

d:驅動是開啟裝置的方式和方法,比如吃豆腐,你可以拿刀切,這裡用刀切就是一種方法,喝豆漿可以用吸管。但刀切和吸管這兩種方式都要向系統註冊,系統將刀切和吃豆腐關聯,將吸管和和豆漿關聯。

之後,當你需要吃豆腐時,系統會呼叫「刀切這個方法」。

4樓:朱涵俊

目前核心已經取消塊裝置,字元裝置。一般用匯流排概念,匯流排上面接裝置,如常見的pci匯流排,pci裝置。之前核心採用字元裝置,塊裝置,有很多弊端,如網路裝置效率比較低,塊裝置有快取,容易丟失資料,效能降低。

一般的核心都取消了字元裝置,塊裝置模式,或者因為相容性繼續保留。改用匯流排驅動模式。網路裝置作為乙個裝置型別存在,而不是之前的字元裝置或者塊裝置。

Linux核心中被中斷打斷的任務處於什麼狀態,能夠在中斷返回前繼續排程嗎?

Hello小崔 乙個核心執行緒在執行中被中斷打斷以後這個被打斷的核心執行緒處於一種什麼狀態?核心執行緒執行中是running狀態,被中斷打斷仍然是running,並不會改變狀態。這個核心執行緒在中斷沒返回之前還能夠被排程器排程嗎?還是說必須要等到中斷返回才能繼續執行,必須等到中斷執行完畢。 薛進 等...

Linux核心中許多晶元的驅動程式都已經存在,為何還要開發這些晶元的驅動?

我猜你不是講驅動,而是講BSP。講乙個最簡單的事情,就算Linux當中含有我所有要的驅動,這些驅動針對某乙個晶元的具體實現。但是老大,ARM上ACPI才推行幾年?何況也不流行。那SoC怎麼知道我在我IO port上連線了那些傢伙?何況我又要把這些IO port配置成什麼模式?ARM當中乙個IO可能可...

Windows NT 核心與 Linux 核心相比哪個更安全?

就 Meltdown Spectre 事件,Windows 更安全。Meltdown 技術可以讀取 Linux Mac OS 的整個物理記憶體和 Windows 的大部分物理記憶體。參考 如何看待 2018 年 1 月 2 日爆出的 Intel CPU 設計漏洞? 漏網之魚 這問題本來就沒啥意義,沒...