姓名:王央京? ? 學(xué)號(hào):18050100052? ?學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:https://blog.csdn.net/manongxianfeng/article/details/115304924
【嵌牛導(dǎo)讀】本文介紹了Linux設(shè)備驅(qū)動(dòng)的相關(guān)信息
【嵌牛鼻子】Linux設(shè)備驅(qū)動(dòng)
【嵌牛提問】在了解Linux系統(tǒng)后,能否介紹內(nèi)核中的設(shè)備驅(qū)動(dòng)?
【嵌牛正文】
設(shè)備驅(qū)動(dòng)程序是 Linux 內(nèi)核的主要部分。和操作系統(tǒng)的其它部分類似,設(shè)備驅(qū)動(dòng)程序運(yùn)行在高特權(quán)級(jí)的處理器環(huán)境中,從而可以直接對(duì)硬件進(jìn)行操作,但正因?yàn)槿绱?,任何一個(gè)設(shè)備驅(qū)動(dòng)程序的錯(cuò)誤都可能導(dǎo)致操作系統(tǒng)的崩潰。設(shè)備驅(qū)動(dòng)程序?qū)嶋H控制操作系統(tǒng)和硬件設(shè)備之間的交互。
設(shè)備驅(qū)動(dòng)程序提供一組操作系統(tǒng)可理解的抽象接口完成和操作系統(tǒng)之間的交互,而與硬件相關(guān)的具體操作細(xì)節(jié)由設(shè)備驅(qū)動(dòng)程序完成。一般而言,設(shè)備驅(qū)動(dòng)程序和設(shè)備的控制芯片有關(guān),例如,如果計(jì)算機(jī)硬盤是 SCSI 硬盤,則需要使用 SCSI 驅(qū)動(dòng)程序,而不是 IDE 驅(qū)動(dòng)程序。
Linux設(shè)備分類:
1. 字符設(shè)備:字符(char)設(shè)備是個(gè)能夠像字節(jié)流(類似文件)一樣被訪問的設(shè)備,由字符設(shè)備驅(qū)動(dòng)程序來實(shí)現(xiàn)這種特性。字符設(shè)備驅(qū)動(dòng)程序通常至少要實(shí)現(xiàn)open、close、read和write的系統(tǒng)調(diào)用。
2、塊設(shè)備:和字符設(shè)備類似,塊設(shè)備也是通過/dev目錄下的文件系統(tǒng)節(jié)點(diǎn)來訪問。塊設(shè)備(例如磁盤)上能夠容納filesystem。在大多數(shù)的Unix系統(tǒng)中,進(jìn)行I/O操作時(shí)塊設(shè)備每次只能傳輸一個(gè)或多個(gè)完整的塊,而每塊包含512字節(jié)(或2的更高次冪字節(jié)的數(shù)據(jù))。
3、網(wǎng)絡(luò)設(shè)備:任何網(wǎng)絡(luò)事物都需要經(jīng)過一個(gè)網(wǎng)絡(luò)接口形成,網(wǎng)絡(luò)接口是一個(gè)能夠和其他主機(jī)交換數(shù)據(jù)的設(shè)備。接口通常是一個(gè)硬件設(shè)備,但也可能是個(gè)純軟件設(shè)備,比如回環(huán)(loopback)接口。網(wǎng)絡(luò)接口由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)動(dòng),負(fù)責(zé)發(fā)送和接收數(shù)據(jù)包。
與設(shè)備相對(duì)應(yīng)的是三類設(shè)備驅(qū)動(dòng)程序,字符設(shè)備驅(qū)動(dòng)程序、塊設(shè)備驅(qū)動(dòng)程序、網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。
在linux的世界里一切皆文件,所有的硬件設(shè)備操作到應(yīng)用層都會(huì)被抽象成文件的操作。我們知道如果應(yīng)用層要訪問硬件設(shè)備,它必定要調(diào)用到硬件對(duì)應(yīng)的驅(qū)動(dòng)程序。接下來介紹如何精確的調(diào)用到底層的驅(qū)動(dòng)程序。
(1)當(dāng)open函數(shù)打開設(shè)備文件時(shí),可以根據(jù)設(shè)備文件對(duì)應(yīng)的struct inode結(jié)構(gòu)體描述的信息,可以知道接下來要操作的設(shè)備類型(字符設(shè)備還是塊設(shè)備),還會(huì)分配一個(gè)struct file結(jié)構(gòu)體。
(2) 根據(jù)struct inode結(jié)構(gòu)體里面記錄的設(shè)備號(hào),可以找到對(duì)應(yīng)的驅(qū)動(dòng)程序。這里以字符設(shè)備為例。在Linux操作系統(tǒng)中每個(gè)字符設(shè)備都有一個(gè)struct cdev結(jié)構(gòu)體。此結(jié)構(gòu)體描述了字符設(shè)備所有信息,其中最重要的一項(xiàng)就是字符設(shè)備的操作函數(shù)接口。
(3) 找到struct cdev結(jié)構(gòu)體后,linux內(nèi)核就會(huì)將struct cdev結(jié)構(gòu)體所在的內(nèi)存空間首地址記錄在struct inode結(jié)構(gòu)體i_cdev成員中,將struct cdev結(jié)構(gòu)體中的記錄的函數(shù)操作接口地址記錄在struct file結(jié)構(gòu)體的f_ops成員中。
(4) 任務(wù)完成,VFS層會(huì)給應(yīng)用返回一個(gè)文件描述符(fd)。這個(gè)fd是和struct file結(jié)構(gòu)體對(duì)應(yīng)的。接下來上層應(yīng)用程序就可以通過fd找到struct file,然后在有struct file找到操作字符設(shè)備的函數(shù)接口了。