概念:在linux系統中,所有裝置都被對映成 【裝置檔案】 來處理,裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。
一、裝置型別
相當不錯,建議有時間看下原文
)《第一章 裝置驅動簡介 1.3.節 裝置和模組的分類》
《linux裝置驅動之字元裝置驅動》
一般情況下,以 linux 的裝置可區分為 3 種基本裝置型別:字元裝置、塊裝置, 網路裝置
乙個字元裝置或塊裝置都在/dev目錄下對應乙個裝置檔案。
linux使用者程式通過裝置檔案(或稱裝置節點)來使用驅動程式操作字元裝置和塊裝置。
字元裝置
是指只能乙個位元組乙個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後資料。
字元裝置是面向流的裝置,常見的字元裝置有滑鼠、鍵盤、串列埠、控制台和led裝置等。
本控制台( /dev/console )和串列埠( /dev/ttys0)是字元裝置的例子, 因為它們很好地展現了流的抽象.
字元裝置通過檔案系統結點來訪問, 例如 /dev/tty1 和 /dev/lp0.
在乙個字元裝置和乙個普通檔案之間唯一有關的不同就是, 你經常可以在普通檔案中移來移去, 但是大部分字元裝置僅僅是資料通道, 你只能順序訪問.然而, 存在看起來象資料區的字元裝置, 你可以在裡面移來移去. 例如, frame grabber 經常這樣, 應用程式可以使用 mmap 或者 lseek 訪問整個要求的影象.
字元裝置檔案(型別為c):
備註:細心的人,可能會發現裝置檔案是無檔案大小的,取而代之的是兩個號碼:主裝置號+此裝置號(見下文)
塊裝置
是指可以從裝置的任意位置讀取一定長度資料的裝置。塊裝置包括硬碟、磁碟、u盤和sd卡等
如同字元裝置, 塊裝置通過位於 /dev 目錄的檔案系統結點來訪問.
乙個塊裝置(例如乙個磁碟)應該是可以駐有乙個檔案系統的.
在大部分的 unix 系統, 乙個塊裝置只能處理這樣的 i/o 操作, 傳送乙個或多個長度經常是 512 位元組( 或乙個更大的 2 的冪的數 )的整塊.
linux, 相反, 允許應用程式讀寫乙個塊裝置象乙個字元裝置一樣 -- 它允許一次傳送任意數目的位元組. 結果就是, 塊和字元裝置的區別僅僅在核心以及在內部管理資料的方式上, 並且因此在核心/驅動的軟體介面上不同. 如同乙個字元裝置, 每個塊裝置都通過乙個檔案系統結點被訪問的, 它們之間的區別對使用者是透明的. 塊驅動和字元驅動相比, 與核心的介面完全不同.
塊裝置檔案(型別為b):
網路介面
任何網路事務都通過乙個介面來進行, 就是說, 乙個能夠與其他主機交換資料的裝置.
通常, 乙個介面是乙個硬體裝置, 但是它也可能是乙個純粹的軟體裝置, 比如環迴介面.
乙個網路介面負責傳送和接收資料報文, 在核心網路子系統的驅動下, 不必知道單個事務是如何對映到實際的被傳送的報文上的.
很多網路連線( 特別那些使用 tcp 的)是面向流的, 但是網路裝置卻常常設計成處理報文的傳送和接收.
乙個網路驅動對單個連線一無所知; 它只處理報文.
既然不是乙個面向流的裝置, 乙個網路介面就不象 /dev/tty1 那麼容易對映到檔案系統的乙個結點上.
unix 提供的對介面的訪問的方式仍然是通過分配乙個名子給它們( 例如 eth0 ), 但是這個名子在檔案系統中沒有對應的入口.
備註:linux檔案型別還包括: 普通檔案(-), 套接字檔案(s), 鏈結檔案(l),可見:《linux檔案型別全解析
》, 剩下還有其他:目錄(d), 資料傳輸檔案(fifo, pipe),
二、主裝置號 與 次裝置號
檢視 主裝置號 與 次裝置號: ls -al /dev
檢視當前已載入的裝置驅動程式的主裝置號: cat /proc/devices
第一列為主裝置號,第二列為裝置名
每個字元裝置和塊裝置都必須有主次裝置號,主裝置號相同的裝置是同類裝置(使用同一驅動程式)
區別是否同類裝置,可以更好的對裝置進行管理和優化,主要體現在:
系統可能包含幾個同樣型別的裝置,由同乙個裝置驅動程式管理(不需要重複載入驅動到核心)
可以將同類裝置合併起來,便於插入到核心的資料結構中進行管理
三、其他
參照:《linux核心--裝置檔案命名(官方文件)》, 《對於linux核心tty裝置的一點理解》
以下是在 mac 系統中的一些小實驗:
tty
1. 開啟兩個終端,都切換到 root
step1: 終端1:
root# tty
/dev/ttys001
#持續監控 ttys001 檔案內容
root# tail -f /dev/ttys001
step2: 終端2:
root# echo 'hello /dev/ttys0001' > /dev/ttys001
step3: 終端1 輸出了一下內容:
hello /dev/ttys0001
2. ssh 到一台linux系統,都切換到 root
step1: 終端1:
root# tty
/dev/pts/0
#持續監控 ttys001 檔案內容
root# tail -f /dev/pts/0
step2: 終端2:
echo 'hello /dev/pts/0' > /dev/pts/0
step3: 終端1 輸出了一下內容:
hello /dev/pts/0
裝置和模組的分類
以 linux 的方式看待裝置可區分為 3 種基本裝置型別.每個模組常常實現 3 種型別中的 1 種,因此可分類成字元模組,塊模組,或者乙個網路模組.這種將模組分成不同型別或類別的方法並非是固定不變的 程式設計師可以選擇建立在乙個大塊 中實現了不同驅動的巨大模組.但是,好的程式設計師,常常建立乙個不...
Linux 裝置檔案分類
linux 的乙個重要特點就是將所有的裝置都當做檔案進行處理,這一類特殊檔案就是裝置檔案,它們可以使用前面提到的檔案 i o 相關函式進行操作,這樣就大大方便了對裝置的處理。它通常在 dev 下面存在乙個對應的邏輯裝置節點,這個節點以檔案的形式存在。linux系統的裝置檔案分為三類 塊裝置檔案 字元...
Linux驅動裝置分類
1.字元驅動裝置 指訪問時沒有快取的裝置,採用位元組流訪問的裝置,如按鍵,串列埠,音效卡,觸控螢幕等 2.塊驅動裝置 有快取來支援,塊裝置必須能夠隨機訪問 random access 字元裝置則沒有這個要求。unix下,採用乙個資料塊來進行訪問,資料塊一般為512位元組,1k等,linux下,可以採...