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