1. 字符設備
字符設備指能夠像字節流串行順序依次進行訪問的設備,對它的讀寫是以字節爲單位。字符設備的上層沒有磁盤文件系統,所以字符設備的file_operations成員函數就直接由字符設備驅動提供(一般字符設備都會實現相應的fops集),因此file_operations 也就成爲了字符設備驅動的核心。
特點:
-
一個字節一個字節讀寫的設備
-
讀取數據需要按照先後數據(順序讀取)
-
每個字符設備在/dev目錄下對應一個設備文件,linux用戶程序通過設備文件(或稱設備節點)來使用驅動程序操作字符設備。
-
常見的字符設備有鼠標、鍵盤、串口、控制檯等
上層應用如何調用底層驅動:
1)應用層的程序open(“/dev/xxx”,mode,flags)打開設備文件,進入內核中,即虛擬文件系統中。
2)VFS層的設備文件有對應的struct inode,其中包含該設備對應的設備號,設備類型,返回的設備的結構體。
3)在驅動層中,根據設備類型和設備號就可以找到對應的設備驅動的結構體,用i_cdev保存。該結構體中有很重要的一個操作函數接口file_operations。
4)在打開設備文件時,會分配一個struct file,將操作函數接口的地址保存在該結構體中。
5)VFS層 嚮應用層返回一個fd,fd是和struct file相對應,這樣,應用層可以通過fd調用操作函數,即通過驅動層調用硬件設備。
2. 塊設備
塊設備以數據塊的形式存放數據,如NAND Flash以頁爲單位存儲數據,並採用mount方式掛載塊設備。
塊設備必須能夠隨機存取(random access),字符設備則沒有這個要求。
塊設備除了給內核提供和字符設備一樣的接口外,還提供了專門面向塊設備的接口,塊設備的接口必須支持掛裝文件系統,通過此接口,塊設備能夠容納文件系統,因此應用程序一般通過文件系統來訪問塊設備上的內容,而不是直接和設備打交道。
對於塊設備而言,上層ext2,jiffs2,fat等文件系統會 實現針對VFS的file_opertations成員函數,所以設備驅動層將看不到file_opeations的存在。磁盤文件系統和設備驅動會將對磁盤上文件的訪問轉換成對磁盤上柱面和扇區的訪問。
特點:
-
數據以固定長度進行傳輸,比如512K
-
從設備的任意位置(可跳)讀取,但實際上,塊設備會讀一定長度的內容,而只返回用戶要求訪問的內容,所以隨機訪問實際上還是讀了全部內容。
-
塊設備包括硬盤、磁盤、U盤和SD卡等
-
每個塊設備在/dev目錄下對應一個設備文件,linux用戶程序可以通過設備文件(或稱設備節點)來使用驅動程序操作塊設備。
-
塊設備可以容納文件系統,所以一般都通過文件系統來訪問,而不是/dev設備節點。
3. 網絡設備
雖然在Linux系統存在一句話叫一切皆文件,無論是各種文本文件還是具體的硬件設備(硬件由設備文件來實現相應)。但是網絡設備在Linux內核中卻是唯一不體現一切皆設備思想的驅動架構,因爲網絡設備使用套接字來實現網數據的接受和發送。
網絡設備驅動不同於字符設備和塊設備,不在/dev下以文件節點代表,而是通過單獨的網絡接口來代表。
特點:
-
網絡接口沒有像字符設備和塊設備一樣的設備號和/dev設備節點,只有接口名,如eth0,eth1
-
通過socket操作,而不是open read write
除了網絡設備外,字符設備和塊設備都是通過文件系統的系統調用接口open()、close()、write()、read()等函數既可以訪問,應用程序可以通過打開設備文件(如UART0設備:/dev/ttyS0)來訪問該設備。