閱讀216 返回首頁    go 中電雲集


FreeBSD設備文件

設備文件

對於每種硬件設備,係統內核有相應的設備驅動程序負責對它的處理。而在Unix中,使用設備文件的方式來表示 硬件設備,每種設備驅動程序都被抽象為設備文件的形式,這樣就給應用程序一個一致的文件界麵,方便應用程序和操作係統 之間的通信。所有的設備文件都放置在/dev目錄下。

$ ls -l /dev/rfd0 /dev/fd0

brw-r-----  9 root operator 2, 0 Nov 12 13:32 /dev/fd0

crw-r-----  9 root operator 9, 0 Nov 12 13:32 /dev/rfd0

在上麵的列表中可以看到原來顯示文件大小的地方,現在改為顯示兩個用逗號分隔的數字。這是係統用來表示設備的 兩個重要的序號,第一個為主設備號(major number),用來表示設備使用的硬件驅動程序在係統中的序號;第 二個為從設備號(minor number),硬件驅動程序使用它來區分不同的設備和判斷如何進行處理。FreeBSD 下主設備號用8位表示,而從設備號用24位來表示。事實上設備文件的名字並不重要,重要的是這兩個設備號,操作係統 使用它確定硬件驅動程序,並與硬件驅動程序進行通信。

  • 磁盤和塊設備文件

在Unix下將設備分為兩種,塊設備和字符設備,其中塊設備主要用於隨機存取的目的,磁盤為這一類設備的代表 ,而字符設備用於順序存取的目的,例如磁帶或終端設備。

磁盤設備的命名方式在前一章中提到過,磁盤設備由磁盤名、磁盤的序號、分區的序號、以及FreeBSD子分區 的序號來表示,例如在設備wd0s1a中,wd為驅動程序,此後為設備序號,0表示為這個驅動程序的第一個設備,Unix 習慣上從0開始計數,第三部分的分區序號為s1,注意這裏為第一個分區,因為s1是從1開始向下排列的,與一般Unix 的習慣不同,這是因為分區的概念是一個DOS概念,因此這裏也使用與DOS相對應的順序,最後一個a為FreeBSD 子分區的順序,每個UFS基本分區可以有8個子分區,這8個分區按照習慣用於不同的目的,例如wd0s1a用於 根文件係統,wd0s1b用做交換分區,使用wd0s1c表示整個硬盤分區wd0s1。因此可以將fd0c用於對整個 軟盤fd0進行存取,wcd0c用於對整個光盤wcd0進行存取等。

傳統名字,例如wd0a,可以用於表示第一個UFS分區上的a子分區,如wd0s1a。一般一個硬盤上隻有一 個UFS分區,因此可以直接使用傳統名字標識磁盤分區。

在使用ls命令列表時,係統使用c(character)標識一個字符設備文件,使用b(block)標識塊 設備文件。

$ ls -l /dev/*wd0s1

crw-r----- 1 root operator 3, 131072 Oct 31 19:59 /dev/rwd0s1

brw-r----- 1 root operator 0, 131072 Oct 31 19:59 /dev/wd0s1

雖然硬盤設備為塊設備,用於隨機存取的目的。但它也可以被順序存取,這種方式稱為raw方式。使用raw方式 存取硬盤,就需要一個對應的字符類型的設備文件,對應wd0s1硬盤設備的字符類型硬盤設備為rwd0s1,設備名中 第一個字母使用r表示對硬盤的raw方式順序存取。

由於設備文件就代表了整個設備,就可以使用FreeBSD的標準命令以raw方式直接操作設備文件,從而直接 訪問硬件設備。利用這種方式,能完成很多有用的工作,但是這種方式也非常危險,例如對硬盤設備文件的操作失誤會破壞整 個硬盤的數據。幸好大部分直接訪問設備的操作都為讀取相應數據的操作,而不需要寫入磁盤設備。

當某個設備不可使用,則其對應的設備文件也不能正常訪問,因此直接訪問設備文件可以判斷對應的設備是否真正正 常。例如,判斷連接到第一個串口,ttyd0上的鼠標是否正常工作,使用命令 “cat </dev/ttyd 0” 來查看ttyd0上的輸入數據,如果連接的有鼠標且工作正常,那麼在移動鼠標的同時屏幕上就會顯示出接收到的雜 亂數據。如果沒有反應,說明鼠標工作不正確。但這也可能是其他程序接管了這個設備,例如係統運行了moused。如果 moused控製了鼠標端口,那麼 “cat < /dev/sysmouse” 會給出答案。

cat或其他命令,沒有控製具體接收到數據的多少,更有效的係統工具是dd,它能精確輸入輸出一定數量的數據 。例如:# dd if=/dev/rwd0 of=mbr count=1 bs=512

這將以512字節為單位,讀取硬盤wd0上一個單位的數據,保存到名字為mbr的文件中,通常這是硬盤wd0 上的主引導扇區。

  • 終端設備

終端設備文件為標識用戶與係統連接的終端設備的設備文件,這是一種典型的字符設備文件。普通的終端一般使用串 口和主機相連接,係統使用終端文件來描述這個連接的終端。通常第一個串口連接的設備為ttyd0(標準個人計算機第一 個串口連接的常常是鼠標),第二個串口為ttyd1,依次類推。

如果用戶是使用telnet或其他遠程登錄的方式,那麼係統使用一個偽設備文件與用戶的偽終端相對應,這些偽 終端設備文件為ttyp0到ttysv,ttyP0到ttySv。這樣就能支持相當多用戶同時登錄係統。

Unix是多用戶、多任務係統,但是個人計算機僅僅有一個屏幕,熟練Unix用戶喜歡同時進行幾個工作,例如 在一邊下載文件,一邊進行編程等,對於直接使用控製台的FreeBSD用戶來講,FreeBSD提供的虛擬終端能完美 的解決這個問題。

對於在控製台上的虛擬終端,對應的終端設備文件為ttyv0、ttyv1、ttyv3等,與鍵盤上的12個功 能鍵相對應。控製台設備被係統用來輸出很多必要的信息,包括各種登錄信息等對係統安全非常相關的信息。由於在控製台上 操作就是在個人計算機前麵操作,因此通常在控製台上能完成許多在其他終端上不能完成的操作,例如:使用Ctrl+Alt+Del 重起係統等。為了保證係統安全,必須限製對控製台的物理訪問。

對於不在控製台的用戶,就需要額外的應用程序的支持,在X終端上能使用X Window係統開出多個窗口,每 個窗口對應一個偽終端。在字符終端上,也可以通過應用程序screen打開幾個偽終端,但這需要安裝相應的軟件。這些 偽終端都使用ttyp0等偽設備文件。

與終端相關的另一個問題為不同的終端設備分為不同的終端類型,這是因為雖然終端是字符型設備,但又要求它能夠 具備更複雜的功能,例如進行全屏幕操作等。這樣就要求終端設備能接受和識別一些控製字符,而不同的終端設備具備不同的 控製字符。登錄用戶可以使用TERM環境變量來告訴應用程序當前使用的終端類型,常用的終端類型有vt100,ansi 等,FreeBSD控製台的終端類型為cons25,但是其他Unix中一般不識別這個類型,因此如果在FreeBSD 上通過telnet等連接到其他Unix上之後,應該改變TERM變量的值為ansi。

在FreeBSD中,終端類別對應的控製字符使用termcap的方法定義,而System V中使用ter minfo的方式。所有的終端類型記錄在/usr/share/misc/termcap文件中,並定義這些終端對應 的控製字符。

登錄到係統之後,將有一個終端設備文件與用戶的這個登錄過程相聯係。這個終端設備文件在控製台上登錄時可能是 /dev/ttyv0,如果從網絡上遠程登錄可能是/dev/ttyp0,但無論是那種情況,係統總使用/dev/t ty來代表用戶當前使用的終端,直接訪問/dev/tty將對當前的終端進行直接操作。

除了這些與設備相聯係的設備文件之外,還有一些特殊的設備文件。例如/dev/zero文件代表一個永遠輸出 0的設備文件,使用它作輸入可以得到全為空的文件。因此可用來創建新文件和以覆蓋的方式清除舊文件。下麵使用dd命令 將從zero設備中創建一個10K大小(bs決定每次讀寫1024字節,count定義讀寫次數為10次),但內容全 為0的文件。

# dd if=/dev/zero of=file count=10 bs=1024

10+0 records in

10+0 records out

10240 bytes transferred in 0.001408 secs (7267903 b ytes/sec)

另一個特殊設備文件為/dev/null,永遠無法寫滿,寫入的內容被係統立即丟棄。如果不想看到程序的輸出 ,可以使用它作輸出。

# make world > /dev/null

去除了屏幕輸出,使整個程序執行過程非常平靜。

  • 設備文件的創建

通常情況下,安裝係統時已經創建了常用的設備文件,可以直接訪問這些設備文件來訪問設備。但在用戶重新定製內 核,並添加了新硬件驅動程序之後,新驅動程序對應的設備文件就可能不存在。在FreeBSD中,最常見的例子就是在內 核中增加聲卡的驅動程序時,就需要創建相應設備文件。

創建設備文件可以使用/dev目錄下的shell程序MAKEDEV來完成,首先進入/dev目錄,然後再執 行MAKEDEV。

# cd /dev

# ./MAKEDEV snd0

MAKEDEV將使用設備名作參數創建設備文件,同時也創建這個設備文件依賴的其他相關設備文件。MAKEDEV 的參數,並不一定為創建的設備文件名。例如建立 “MAKEDEV vty8” 將建立ttyv0到ttyv7共 8個設備文件,使用 “MAKEDEV wd1s1a” 命令,將建立wd1、wd1s1、wd1s2等,以及wd1s1a、wd1s1b 等設備文件。也可以使用all做MAKEDEV的參數,這將首先清除/dev目錄下的所有設備文 件,然後MAKEDEV創建所有預設的設備文件。一般情況下這將創建足夠多的設備文件,其中的大部分設備文件在具體的 係統中不會用得到。

如果對一個係統中沒有(或者內核沒有探測到)的設備對應的設備文件進行操作,則係統返回Device not configured 的錯誤信息。

MAKEDEV將使用mknod和對應設備的正確參數,包括字符或塊設備、主設備號和從設備號來建立相應的設 備文件。管理員也可以直接使用mknod創建設備文件,但這就必須將這些設備參數統統指定正確才行。因此除非對係統中 的硬件驅動程序特別熟悉,一般不直接使用mknod來創建設備文件。

最後更新:2017-01-04 22:34:38

  上一篇:go 網站推廣之如何讓網站流量飛起來
  下一篇:go 如何識別出高質量的友情鏈接