在linux下,字元裝置和塊裝置都體現了「一切皆為檔案」的思想,對於這兩種裝置而言,他們在linux系統中都有乙個對應的檔案來「代表」它們的存在,那就是裝置檔案。應用程式通過操作某個裝置檔案,便可以操作對應的硬體。裝置有主裝置號和次裝置號,例如在linux下通過ls -l /dev/ttys0命令可以看到如圖資訊
對於/dev/ttys0裝置檔案,c表示它是乙個字元裝置檔案(如果是'b'則是塊裝置檔案),4是它的主裝置號,64是它的次裝置號。linux系統根據裝置檔案的型別可以知道它是字元裝置還是塊裝置,通過主裝置號就可以找到它在核心中註冊的file_operations結構,而次裝置號是驅動程式本身用來區分它是同類裝置中低第幾個,也就是說相同的主裝置號表示同一類裝置,次裝置號則用來區分這類裝置中的哪乙個。
在寫驅動程式時,一般在初始化函式中利用register_chrdev()函式向核心註冊裝置號:
int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
major是指定的主裝置號(必須是可用並且系統未使用的),如果這個引數設為0,則表示由系統分配,為了避免衝突的麻煩,一般都設為0,由系統分配,再定義乙個變數來接受這個函式的返回值得到主裝置號;name代表名字 可以任意取;fops是要註冊的file_operatios結構體指標;這樣就完成了註冊。同樣,在解除安裝函式中則要用 int unregister_chrdev(unsigned int major, const char *name)函式去解除安裝。例如:
以上只是向核心註冊了該驅動程式的file_operations結構體和裝置號,在掛載驅動程式時依然沒有建立對應的裝置檔案。在建立裝置檔案之前,首先通過cat /proc/devices命令檢視是否已經建立好「led」裝置節點,並檢視其主裝置號。建立裝置檔案的方法有兩種:
手工建立:就是在掛載驅動程式之後,根據led的主裝置號(假設是252)通過命令建立,如:mknod /dev/leds c 252 1 建立,此時在/dev下就有乙個對應裝置檔案
在載入驅動程式時自動建立:linux核心提供了一組函式,可以在模組載入時自動在/dev目錄下建立相對應的裝置節點,並在解除安裝模組時刪除該節點,能實現這樣操作的前提是使用者空間已經移植了udev(簡化版本的mdev)。相關的函式和結構:(1)struct class,是乙個裝置結構體,註冊乙個類結構,會在/sys/class目錄下建立對應的資料夾,資料夾中儲存有在/dev目錄下自動生成裝置節點的資訊。(2)struct class_device結構體。建立使用如圖
這樣在掛載成功驅動程式之後,在/sys/class下就產生了乙個led資料夾,裡面有乙個leds檔案的包含資訊;並且已經自動在/dev目錄下建立好了leds字元裝置檔案,不用手動建立。
相比之下,一般使用第二種方法更加簡便,也適合使用。
建立字元裝置的三種方法
建立字元裝置的三種方法 這篇文章已經在網上廣為流傳,你可以在找到這篇文章的乙份拷貝,從瀏覽量上看定有許多人參考過這篇文章,但是很遺憾,它的第三種方法有乙個嚴重的問題,記憶體洩露!雖然大多數時候它跑的很好,而記憶體洩露導致系統崩潰也是幾無可能,但是這是乙個模板,如果大多數人在寫驅動時參考了這篇文章,並...
linux字元裝置驅動中自動建立裝置節點
簡述 1 裝置號 驅動等概念性問題 2 裝置號的自動分配和手動指定 3 mknode手動建立節點。編碼實現 1 核心點 要使的驅動能夠在載入時自動完成裝置節點的註冊,主要流程如下 驅動載入時完成如下工作 分配裝置號 註冊字元裝置 動態建立裝置節點。驅動解除安裝時完成如下工作 刪除裝置節點 取消字元裝...
裝置節點的動態建立
我們在剛開始寫linux裝置驅動程式的時候,很多時候都是利用mknod命令手動建立裝置節點,實際上linux核心為我們提供了一組函式,可以用來在模組載入的時候自動在 dev目錄下建立相應裝置節點,並在解除安裝模組時刪除該節點,當然前提條件是使用者空間移植了udev。核心中定義了struct clas...