第一章 Linux設備管理概述 1.1 設備分類 在Linux系統中,對設備的管理有其自身的特點:對所有的硬件設備進行了抽象,使得計算機用戶對硬件設備的操作與對文件的操作十分相似,可以通過與操作文件完全一樣的標准系統調用來打開、關閉、讀和寫設備。 Linux將所有的硬件設備被歸結為三類: 字符設備: 字符設備指無需緩沖就可以直接讀寫的設備。用戶可以像訪問文件一樣訪問字符設備,字符設備驅動程序負責實現這些訪問操作。驅動程序通常會實現open,close,read和write系統調用。鍵盤和鼠標就是字符設備的典型例子。通過文件系統節點可以訪問字符設備,例如/dev/tty1和/dev/lp1。字符設備和普通文件系統間的顯著區別是:普通文件允許在其上來回讀寫,而大多數字符設備僅僅是數據通道,只能順序讀寫。當然,也存在這樣的字符設備,看起來像是個數據區,可以來回讀取其中的數據。 塊設備: 塊設備是文件系統的宿主,如硬盤、光驅、軟驅等。在大多數Unix系統中,只能將塊設備看作多個塊進行訪問,一個塊通常是1KB字節數據。Linux允許用戶像字符設備那樣讀取塊設備--允許一次傳輸任意數目的字節。塊設備和字符設備只在內核內部的管理上有所區別,因此也就是在內核/驅動程序間的軟件接口上有所區別。就像字符設備一樣,每個塊設備也通過文件系統節點來讀寫數據,它們之間的不同對用戶來說是透明的。塊設備驅動程序和內核的接口與字符設備驅動程序的接口是一樣的,它也是通過一個傳統的面向塊的接口與內核通信,但這個接口對用戶來說是不可見的。 網絡設備: 網絡設備與字符設備和塊設備最大的不同之處就在於網絡設備沒有對應的設備文件。網卡是最典型的一個例子。 網卡把向外發送的數據寫入通往遠程計算機系統的一條通信線路上,把從遠程系統中接受到的報文裝入內核內存。在Unix系統中,計算機為每個網卡分配一個不同的符號名,例如:eth0,eth1等。然而這個名字並沒有對應的設備文件,也沒有對應的索引節點。 由於沒有使用文件系統,所以系統管理員必須建立設備名和網絡地址之間的聯系。因此,應用程序和網絡接口之間的數據通信不是基於標准的有關文件的read()、write()等系統調用,而是基於socket()、bind()、listen()、accept()、connect()系統調用,這些系統調用對網絡地址進行操作。 1.2 主設備號和次設備號 傳統方式的設備管理中,除了設備類型(字符設備或塊設備)以外,內核還需要一對稱作主、次設備號的參數來唯一標識一個設備。主設備號標識設備對應的驅動程序,內核利用主設備號將設備與對應的驅動程序對應起來。次設備號只由設備驅動程序使用,內核的其他部分不使用它。一個驅動程序可以控制若干個設備,次設備號可將使用同一驅動程序的不同設備區分開來。 所有設備在適當的目錄(通常在/dev目錄下)下必須有相應的特殊文件,這樣字符設備和塊設備都可以通過文件操作完成系統調用了。設備文件是特殊文件,這一點可以通過命令“ls -l”輸出的第一列中的“c”標明,它說明它們是字符節點;塊設備的第一列是“b”。在執行了“ls -l”命令之後,在設備文件條目的最新修改日期前可看到兩個數(用逗號分隔),這個位置通常顯示常規文件的長度。這兩個數就是相應設備的主設備號和次設備號。下面列表顯示了我使用的系統上的一些設備,它們的主設備號分別是10、14、29、41、68,而次設備號是3、4、20、7、0、1、2。