1. 程式人生 > >Linux核心能夠識別的裝置,對應原始碼中

Linux核心能夠識別的裝置,對應原始碼中

概述
裝置管理是Linux中比較基礎的東西,但是由於Linux智慧程度的越來越高,Udev的使用越來越廣泛,使得越來越多的Linux新使用者對 /dev 目錄下的東西變得不再熟悉。有時候遇見問題就會變得抓狂。

Linux 中的裝置有2種類型:字元裝置(無緩衝且只能順序存取)、塊裝置(有緩衝且可以隨機存取)。每個字元裝置和塊裝置都必須有主、次裝置號,主裝置號相同的設 備是同類裝置(使用同一個驅動程式)。這些裝置中,有些裝置是對實際存在的物理硬體的抽象,而有些裝置則是核心自身提供的功能(不依賴於特定的物理硬體, 又稱為”虛擬裝置”)。每個裝置在 /dev 目錄下都有一個對應的檔案(節點)。可以通過 cat /proc/devices 命令檢視當前已經載入的裝置驅動程式的主裝置號。核心能夠識別的所有裝置都記錄在原碼樹下的 Documentation/devices.txt 檔案中。在 /dev 目錄下除了字元裝置和塊裝置節點之外還通常還會存在:FIFO管道、Socket、軟/硬連線、目錄。這些東西沒有主/次裝置號。

裝置檔案
Linux核心所能識別的所有裝置都記錄在
http://www.lanana.org/docs/device-list/
而核心原碼樹中的 Documentation/devices.txt 可能不是最新版本。

瞭解這些裝置的最基本要求就是對每個裝置檔案的含義瞭如指掌,下面列出常見的裝置檔案以及相應的含義(比較偏僻的就省略了)。

主裝置號 裝置型別

            次裝置號=檔名          簡要說明

0 未命名裝置(例如:掛載的非裝置)

      0 = 為空裝置號保留

1 char 記憶體裝置

      1 = /dev/mem      直接存取實體記憶體

      2 = /dev/kmem     存取經過核心虛擬之後的記憶體

      3 = /dev/null     空裝置。任何寫入都將被直接丟棄,任何讀取都將得到EOF。

      4 = /dev/port     存取 I/O 埠

      5 = /dev/zero     零位元組源,只能讀取到無限多的零位元組。

      7 = /dev/full     滿裝置。任何寫入都將失敗,並把errno設為ENOSPC以表示沒有剩餘空間。

      8 = /dev/random   隨機數發生器。完全由使用者的輸入來產生隨機數。

                如果使用者停止所有動作,則停止產生新的隨機數。

      9 = /dev/urandom  更快,但是不夠安全的隨機數發生器。儘可能由使用者的輸入來產生隨機數,

                如果使用者停止所有動作,則把已經產生的隨機數做為種子來產生新的隨機數。

     10 = /dev/aio      非同步 I/O 通知介面

     11 = /dev/kmsg     任何對該檔案的寫入都將作為 printk 的輸出

1 block RAM disk

      0 = /dev/ram0     第1個 RAM disk (initrd只能使用ram0)

      1 = /dev/ram1     第2個 RAM disk

        ...

    200 = /dev/ram200   第200個 RAM disk

4 char TTY(終端)裝置

      0 = /dev/tty0     當前虛擬控制檯

      1 = /dev/tty1     第1個虛擬控制檯

        ...

     63 = /dev/tty63    第63個虛擬控制檯

4 block 如果根檔案系統以是以只讀方式掛載的,那麼就不可能建立真正的裝置節點,

    此時就使用該裝置作為動態分配的主(major)裝置的別名

              0 = /dev/root

5 char 其他 TTY 裝置

      0 = /dev/tty      當前 TTY 裝置

      1 = /dev/console  系統控制檯(一般是/dev/tty0)

      2 = /dev/ptmx     所有 PTY master 的複用器

7 char 虛擬控制檯捕捉裝置(這些裝置既允許讀也允許寫)

      0 = /dev/vcs      當前虛擬控制檯(vc)的文字內容

      1 = /dev/vcs1     tty1 的文字內容

        ...

     63 = /dev/vcs63    tty63 的文字內容

    128 = /dev/vcsa     當前虛擬控制檯(vc)的文字/屬性內容

    129 = /dev/vcsa1    tty1 的文字/屬性內容

        ...

    191 = /dev/vcsa63   tty63 的文字/屬性內容

7 block 迴環裝置(用一個普通的磁碟檔案來模擬一個塊裝置)

    對迴環裝置的繫結由 mount(8) 或 losetup(8) 處理

      0 = /dev/loop0    第1個迴環裝置

      1 = /dev/loop1    第2個迴環裝置

        ...

8 block SCSI 磁碟(0-15)

      0 = /dev/sda      第1個 SCSI 磁碟(整個磁碟)

     16 = /dev/sdb      第2個 SCSI 磁碟(整個磁碟)

     32 = /dev/sdc      第3個 SCSI 磁碟(整個磁碟)

        ...

    240 = /dev/sdp      第16個 SCSI 磁碟(整個磁碟)



    分割槽表示方法如下(以第3個 SCSI 磁碟為例)

     33 = /dev/sdc1     第1個分割槽

     34 = /dev/sdc2     第2個分割槽

        ...

     47 = /dev/sdc15    第15個分割槽

    對於Linux/i386來說,分割槽1-4是主分割槽,5-15是邏輯分割槽。

9 block Metadisk(RAID)裝置

      0 = /dev/md0      第1組 metadisk

      1 = /dev/md1      第2組 metadisk

        ...

    metadisk 驅動用於將同一個檔案系統分割到多個物理磁碟上。

10 char 非串列埠滑鼠,各種雜項裝置和特性

      1 = /dev/psaux    PS/2滑鼠

    131 = /dev/temperature  機器內部溫度

    134 = /dev/apm_bios APM(高階電源管理) BIOS

    135 = /dev/rtc      實時時鐘(Real Time Clock)

    144 = /dev/nvram    非易失配置 RAM

    162 = /dev/smbus    系統管理匯流排(System Management Bus)

    164 = /dev/ipmo     Intel的智慧平臺管理(Intelligent Platform Management)介面

    173 = /dev/ipmikcs  智慧平臺管理(Intelligent Platform Management)介面

    175 = /dev/agpgart  AGP圖形地址重對映表(Graphics Address Remapping Table)

    182 = /dev/perfctr  效能監視計數器

    183 = /dev/hwrng    通用硬體隨機數發生器

    184 = /dev/cpu/microcode CPU微程式碼更新介面

    186 = /dev/atomicps 程序狀態資料的原子快照

    188 = /dev/smbusbios    SMBus(系統管理匯流排) BIOS

    200 = /dev/net/tun  TAP/TUN 網路裝置(TAP/TUN以軟體的方式實現了網路裝置)

                TAP模擬了乙太網幀(第二層),TUN模擬了IP包(第三層)。

    202 = /dev/emd/ctl  增強型 Metadisk RAID (EMD) 控制器

    220 = /dev/mptctl   Message passing technology (MPT) control

    223 = /dev/input/uinput 使用者層輸入裝置驅動支援

    227 = /dev/mcelog   X86_64 Machine Check Exception driver

    228 = /dev/hpet     HPET driver

    229 = /dev/fuse     Fuse(使用者空間的虛擬檔案系統)

    231 = /dev/snapshot 系統記憶體快照

    232 = /dev/kvm      基於核心的虛構機(基於AMD SVM和Intel VT硬體虛擬技術)

11 block SCSI CD-ROM 裝置

      0 = /dev/scd0     第1個 SCSI CD-ROM

      1 = /dev/scd1     第2個 SCSI CD-ROM

        ...

13 char 核心輸入裝置

     32 = /dev/input/mouse0     第1個滑鼠

     33 = /dev/input/mouse1     第2個滑鼠

        ...

     62 = /dev/input/mouse30    第31個滑鼠

     63 = /dev/input/mice       所有滑鼠的統一

     64 = /dev/input/event0     第1個事件佇列

     65 = /dev/input/event1     第2個事件佇列

        ...

     95 = /dev/input/event1     第32個事件佇列

21 char 通用 SCSI 裝置(通常是SCSI光碟機)

      0 = /dev/sg0      第1個通用 SCSI 裝置

      1 = /dev/sg1      第2個通用 SCSI 裝置

        ...

29 char 通用幀緩衝(frame buffer)裝置

      0 = /dev/fb0      第1個幀緩衝裝置

      1 = /dev/fb1      第2個幀緩衝裝置

        ...

     31 = /dev/fb31     第32個幀緩衝裝置

30 char iBCS-2 相容裝置

      0 = /dev/socksys  套接字訪問介面

      1 = /dev/spx      SVR3 本地 X 介面

     32 = /dev/inet/ip  網路訪問介面

     33 = /dev/inet/icmp

     34 = /dev/inet/ggp

     35 = /dev/inet/ipip

     36 = /dev/inet/tcp

     37 = /dev/inet/egp

     38 = /dev/inet/pup

     39 = /dev/inet/udp

     40 = /dev/inet/idp

     41 = /dev/inet/rawip



    此外,iBCS-2 還需要下面的連線必須存在

    /dev/ip -> /dev/inet/ip

    /dev/icmp -> /dev/inet/icmp

    /dev/ggp -> /dev/inet/ggp

    /dev/ipip -> /dev/inet/ipip

    /dev/tcp -> /dev/inet/tcp

    /dev/egp -> /dev/inet/egp

    /dev/pup -> /dev/inet/pup

    /dev/udp -> /dev/inet/udp

    /dev/idp -> /dev/inet/idp

    /dev/rawip -> /dev/inet/rawip

    /dev/inet/arp -> /dev/inet/udp

    /dev/inet/rip -> /dev/inet/udp

    /dev/nfsd -> /dev/socksys

    /dev/X0R -> /dev/null

36 char Netlink 支援

      0 = /dev/route    路由, 裝置更新, kernel to user

      3 = /dev/fwmonitor    Firewall packet 複製

59 char sf 防火牆模組

      0 = /dev/firewall 與 sf 核心模組通訊

65 block SCSI 磁碟(16-31)

      0 = /dev/sdq      第17個 SCSI 磁碟(整個磁碟)

     16 = /dev/sdr      第18個 SCSI 磁碟(整個磁碟)

     32 = /dev/sds      第19個 SCSI 磁碟(整個磁碟)

        ...

    240 = /dev/sdaf     第32個 SCSI 磁碟(整個磁碟)

66 block SCSI 磁碟(32-47)

      0 = /dev/sdag     第33個 SCSI 磁碟(整個磁碟)

     16 = /dev/sdah     第34個 SCSI 磁碟(整個磁碟)

     32 = /dev/sdai     第35個 SCSI 磁碟(整個磁碟)

        ...

    240 = /dev/sdav     第48個 SCSI 磁碟(整個磁碟)

89 char I2C 匯流排介面

      0 = /dev/i2c-0    第1個 I2C 介面卡

      1 = /dev/i2c-1    第2個 I2C 介面卡

        ...

98 block 使用者模式下的虛擬塊裝置(分割槽處理方式與 SCSI 磁碟相同)

      0 = /dev/ubda     第1個使用者模式塊裝置

     16 = /dev/udbb     第2個使用者模式塊裝置

        ...

103 block 審計(Audit)裝置

      0 = /dev/audit    審計(Audit)裝置

128-135 char Unix98 PTY master

    這些裝置不應當存在裝置節點,而應當通過 /dev/ptmx 介面訪問。

136-143 char Unix98 PTY slave

    這些裝置節點是自動生成的(伴有適當的許可權和模式),不能手動建立。

    方法是通過使用適當的 mount 選項(通常是:mode=0620,gid=<"tty"組的gid>)

    將 devpts 檔案系統掛載到 /dev/pts 目錄即可。

      0 = /dev/pts/0    第1個 Unix98 PTY slave

      1 = /dev/pts/1    第2個 Unix98 PTY slave

        ...

153 block Enhanced Metadisk RAID (EMD) 儲存單元(分割槽處理方式與 SCSI 磁碟相同)

      0 = /dev/emd/0    第1個儲存單元

      1 = /dev/emd/0p1  第1個儲存單元的第1個分割槽

      2 = /dev/emd/0p2  第1個儲存單元的第2個分割槽

        ...

     15 = /dev/emd/0p15 第1個儲存單元的第15個分割槽



     16 = /dev/emd/1    第2個儲存單元

     32 = /dev/emd/2    第3個儲存單元

        ...

    240 = /dev/emd/15   第16個儲存單元

180 char USB 字元裝置

     96 = /dev/usb/hiddev0  第1個USB人機介面裝置(滑鼠/鍵盤/遊戲杆/手寫版等人操作計算機的裝置)

        ...

    111 = /dev/usb/hiddev15 第16個USB人機介面裝置

180 block USB 塊裝置(U盤之類)

      0 = /dev/uba      第1個USB 塊裝置

      8 = /dev/ubb      第2個USB 塊裝置

     16 = /dev/ubc      第3個USB 塊裝置

        ...

192 char 核心 profiling 介面

      0 = /dev/profile  Profiling 控制裝置

      1 = /dev/profile0 CPU 0 的 Profiling 裝置

      2 = /dev/profile1 CPU 1 的 Profiling 裝置

        ...

193 char 核心事件跟蹤介面

      0 = /dev/trace    跟蹤控制裝置

      1 = /dev/trace0   CPU 0 的跟蹤裝置

      2 = /dev/trace1   CPU 1 的跟蹤裝置

        ...

195 char Nvidia 圖形裝置(比如顯示卡)

      0 = /dev/nvidia0      第1個 Nvidia 卡

      1 = /dev/nvidia1      第2個 Nvidia 卡

        ...

    255 = /dev/nvidiactl        Nvidia 卡控制裝置

202 char 特定於CPU模式的暫存器(model-specific register,MSR)

      0 = /dev/cpu/0/msr        CPU 0 的 MSRs

      1 = /dev/cpu/1/msr        CPU 1 的 MSRs

        ...

203 char CPU CPUID 資訊

      0 = /dev/cpu/0/cpuid      CPU 0 的 CPUID

      1 = /dev/cpu/1/cpuid      CPU 1 的 CPUID



        ...

有沒有感到很奇怪?為什麼沒有 /dev/hda 這樣的裝置,難道不常用麼?原因在於從 2.6.19 版本開始,核心引入了新的ATA驅動,將SATA/PATA硬碟統一使用 /dev/sd? 來表示了,所以 /dev/hd? 就沒有存在的必要了。具體說來也就是你在編譯核心的時候不要再使用”ATA/ATAPI/MFM/RLL support”下面的驅動,而是使用更新的”Serial ATA and Parallel ATA drivers”驅動。

連結、套接字、管道、掛載點
這部分詳細說明一些應該或可能存在於 /dev 目錄之外的檔案。連結最好使用與這裡完全相同的格式(絕對路徑或相對路徑)。究竟是使用硬連結(hard)還是軟連線(symbolic)取決於不同的裝置。

必須的連結
必須在所有的系統上都存在這些連線:

連結 目標 連結型別 簡要說明

/dev/fd /proc/self/fd symbolic 檔案描述府

/dev/stdin fd/0 symbolic 標準輸入檔案描述府

/dev/stdout fd/1 symbolic 標準輸出檔案描述符

/dev/stderr fd/2 symbolic 標準錯誤檔案描述符

/dev/nfsd socksys symbolic 僅為 iBCS-2 所必須

/dev/X0R null symbolic 僅為 iBCS-2 所必須

[注意] /dev/X0R 是 <字母 X>-<數字 0>-<字母 R>

推薦的連結
推薦在所有的系統上都存在這些連線:

連結 目標 連結型別 簡要說明

/dev/core /proc/kcore symbolic 為了向後相容

/dev/ramdisk ram0 symbolic 為了向後相容

/dev/ftape qft0 symbolic 為了向後相容

/dev/bttv0 video0 symbolic 為了向後相容

/dev/radio radio0 symbolic 為了向後相容

/dev/i2o* /dev/i2o/* symbolic 為了向後相容

/dev/scd? sr? hard 代替 SCSI CD-ROM 的名字

本地定義的連結
下面的連結很可能需要根據機器的實際硬體配置建立其中的一部分甚至全部。這些連結僅僅是為了迎合習慣用法,它們既非必須也非推薦。

連結 目標 連結型別 簡要說明

/dev/mouse mouse port symbolic 當前滑鼠

/dev/tape tape device symbolic 當前磁帶

/dev/cdrom CD-ROM device symbolic 當前CD-ROM

/dev/cdwriter CD-writer symbolic 當前CD-writer

/dev/scanner scanner symbolic 當前掃描器

/dev/modem modem port symbolic 當前調變解調器

/dev/root root device symbolic 當前根檔案系統所在裝置

/dev/swap swap device symbolic 當前swap所在裝置

/dev/modem 不應當用於能夠同時支援呼入和撥出的modem,因為往往會導致鎖檔案問題。如果存在 /dev/modem ,那麼它應當指向一個恰當的主 TTY 裝置。

對於SCSI裝置,/dev/tape 和 /dev/cdrom 應該分別指向”cooked”裝置 /dev/st* 和 /dev/sr* ;而 /dev/cdwriter 和 /dev/scanner 應當分別指向恰當的 /dev/sg* 。

/dev/mouse 可以指向一個主序列 TTY 裝置、一個硬體滑鼠、或者一個對應滑鼠驅動程式的套接字(例如 /dev/gpmdata)。

套接字和管道
持久套接字和命名管道可以存在於 /dev 中。常見的有:

/dev/printer socket lpd 本地套接字

/dev/log socket syslog 本地套接字

/dev/gpmdata socket gpm 滑鼠多路複用器(multiplexer)

/dev/gpmctl socket (LFS-LiveCD中出現)

/dev/initctl fifo pipe init 監聽它並從中獲取資訊(使用者與 init 程序互動的通道)

掛載點
以下名稱被保留用於掛載特殊的檔案系統。這些特殊的檔案系統只提供核心介面而不提供標準的裝置節點。

/dev/pts devpts PTY slave 檔案系統

/dev/shm tmpfs 提供對 POSIX 共享記憶體的直接訪問

終端裝置
終端(或TTY)裝置是一種特殊的字元裝置。終端裝置是可以在會話中扮演控制終端角色的任何裝置,包括:虛擬控制檯、序列介面(已廢棄)、偽終端(PTY)。

所有的終端裝置共享一個通用的功能集合:line discipline,它既包含通用的終端 line discipline 也包含SLIP和PPP模式。所有的終端裝置的命名都很相似。這部分內容將解釋命名規則和各種型別的TTY(終端)的使用。需要注意的是這些命名習慣包含 了幾個歷史遺留包袱。其中的一些是Linux所特有的,另一些則是繼承自其他系統,還有一些反映了Linux在成長過程中拋棄了原來借用自其它系統的一些 習慣。井號(#)在裝置名裡表示一個無前導零的十進位制數。

虛擬控制檯(Virtual console)和控制檯裝置(console device)
虛擬控制檯是在系統視訊監視器上全屏顯示的終端。虛擬控制檯被命名為編號從 /dev/tty1 開始的 /dev/tty# 。/dev/tty0 是當前虛擬控制檯。/dev/tty0 用於在不能使用幀緩衝裝置(/dev/fb*)的機器上存取系統視訊卡,注意,不要將 /dev/console 用於此目的。/dev/console 由核心管理,系統訊息將被髮送到這裡。單使用者模式下必須允許 login 使用 /dev/console 。

序列介面
這裡所說的”序列介面”是指 RS-232 序列介面和任何模擬這種介面的裝置,不管是在硬體(例如調變解調器)還是在軟體(例如ISDN驅動)中模擬。在linux中的每一個序列介面都有兩個裝置 名:主裝置或呼入(callin)裝置、交替裝置或撥出(callout)裝置。裝置型別之間使用字母的大小寫進行區分。比如,對於任意字母 X,”tty”裝置名為 /dev/ttyX# ,而”cu”裝置名則為 /dev/cux# 。由於歷史原因,/dev/ttyS# 和 /dev/ttyC# 分別等價於 /dev/cua# 和 /dev/cub# 。名稱 /dev/ttyQ# 和 /dev/cuq# 被保留為本地使用。

偽終端(PTY)
偽終端用於建立登陸會話或提供其它功能,比如通過 TTY line discipline (包括SLIP或者PPP功能)來處理任意的資料生成。每一個 PTY 都有一個master端和一個slave端。按照 System V/Unix98 的 PTY 命名方案,所有master端共享同一個 /dev/ptmx 裝置節點(開啟它核心將自動給出一個未分配的PTY),所有slave端都位於 /dev/pts 目錄下,名為 /dev/pts/# (核心會根據需要自動生成和刪除它們)。

一旦master端被開啟,相應的slave裝置就可以按照與 TTY 裝置完全相同的方式使用。master裝置與slave裝置之間通過核心進行連線,等價於擁有 TTY 功能的雙向管道(pipe)。