/dev 设备文件属性解读
一.???????知識點
1.??????設備號;
2.??????創建設備文件;
3.??????設備注冊;
4.??????重要數據結構;
5.??????設備操作;
?
二.主設備號
字符設備通過字符設備文件來存取。字符設備文件由使用ls? -l?的輸出的第一列的”C”標識;
如果使用ls –l?命令,會看到在設備文件項中有2個數(由一個逗號分隔)這些數字就是設備文件的主次設備編
舉例:
crw-rw----??1 root uucp???? 4,? 66 04-18 21:59 ttyS2
crw-rw----??1 root uucp???? 4,? 67 04-18 21:59 ttyS3
crw-rw-rw-??1 root root???? 1,?? 9 04-18 22:00 urandom
crw-rw----??1 root root?? 249,?? 0 04-18 22:00 usbdev1.1_ep00
crw-rw----??1 root root?? 249,?? 1 04-18 22:00 usbdev1.1_ep81
crw-rw----??1 root root?? 249,?? 2 04-18 22:00 usbdev2.1_ep00
crw-rw----??1 root root?? 249,?? 3 04-18 22:00 usbdev2.1_ep81
crw-rw----??1 root root?? 251,?? 0 04-18 22:00 usbmon0
crw-rw----??1 root root?? 251,?? 1 04-18 22:00 usbmon1
crw-rw----??1 root root?? 251,?? 2 04-18 22:00 usbmon2
crw-rw----??1 vcsa tty????? 7,?? 0 04-18 22:00 vcs
crw-rw----??1 vcsa tty????? 7,?? 1 04-18 22:00 vcs1
crw-rw----??1 vcsa tty????? 7,?? 2 04-18 22:00 vcs2
crw-rw----??1 vcsa tty????? 7,?? 3 04-18 22:00 vcs3
crw-rw----??1 vcsa tty????? 7,?? 4 04-18 22:00 vcs4
?
設備號
設備號用來做什么??
設備號的作用
?
1>.主設備號用來標識與設備文件相連的驅動程序。
次設備號被驅動程序用來辨別操作的是哪個設備。
?
*****主設備號用來反映設備類型******
***次設備號用來區分同類型的哪一個設備***
?
三.主次設備號
Q:內核中如何描述設備號?
A:dev_t
*****其實質為unsigned??int? 32位整數,其中高12位為主設備號,低20位為次設備號。
?
Q:如何從dev_t中分解出主設備號?
A:MAJOR(dev_t??dev)
?
Q:如何從dev_t只分解出次設備號?
A:MINOR(dev_t dev)
?
四.分配主設備號
Linux?內核如何給設備分配主設備號?
可以采用靜態申請,動態分配兩種方法
(動態、靜態是針對主設備號來說的)
?
靜態申請
int??register_chrdev_region(dev_t from ,unsigned count ,const char *name)
?
功能:申請使用從from開始的count?個設備號(主設備號不變,次設備號增加)
參數:
From :希望申請使用的設備號數目
Count :希望申請使用的設備號數目
Name :設備名(體現在/proc/devices)
?
動態分配
?
方法:
使用alloc_chrdev_region分配設備號
?
優點:簡單,易于驅動推廣
缺點:無法在安裝驅動前創建設備文件(因為安裝前還沒分配到主設備號。)
?
解決辦法:
安裝驅動后,從/proc/devices中查詢設備號
?
動態分配
Int alloc_chrdev_region(dev_t *dev,??unsigned baseminor,? unsigned count,? const char *name)
功能:動態申請count個設備號,第1個設備號的次設備號為baseminor.
參數:
Dev:分配到的設備號
Baseminor :起始次設備號
Count :要注冊的設備號個數
Name :設備名(體現在/proc/devices)
主設備號是動態產生的,次設備號(的第一個)是要指定的;
?
??五.注銷設備號
???????不論使用何種方法分配設備號,都應該在不再使用它們的時候釋放這些設備號。
?
Void unregister_chrdev_region(dev_t??from,? unsigned count)
?功能:
釋放從from?開始的count個設備號
?
六.創建設備文件
兩種方法:1.使用mknod命令手工創建;
???2.自動創建
?
手工創建:
mknod用法:
mknod??filename type major minor
filename :設備文件名
type:?設備文件類型
major:主設備號
minor?:次設備號
?
例如:mknod serial0??c ?100 ?0
?
之后?ls??serial0??命令可查
不要0也可以,通過0知道是第幾個設備
?
七.重要結構
在Linux?字符設備驅動程序設計中,有3種非常重要的數據結構:
1.??????struct??file
2.??????struct??inode
3.??????struct??file_operations
?
Stuct??file?
代表一個開打的文件。系統中每一個打開的文件在內核空間都有一個關聯的struct??file .??它由內核在打開文件時創建,在文件關閉后釋放。
(一個文件被打開一次對應一個Struct??file,這個文件同時被打開10次,則對應10個Struct??file)
?
***重要成員
Loff_t??f_pos? /*文件讀寫位置*/
Struct??file_operations *f_op
?
struct??inode
用來記錄文件的物理上的信息。因此,他和代表打開文件的file結構是不同的。
一個文件可以對應多個file結構,但只有一個inode結構。
?
轉載于:https://blog.51cto.com/yumsun/1690558
總結
以上是生活随笔為你收集整理的/dev 设备文件属性解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快捷键让SublimeText在编文件快
- 下一篇: http的学习