|
|
|
不再害怕驅(qū)動(dòng)!Linux字符設(shè)備驅(qū)動(dòng)詳解
現(xiàn)實(shí)世界中存在著大量的設(shè)備,操作系統(tǒng)要求能夠控制和管理這些硬件,而驅(qū)動(dòng)就能幫助實(shí)現(xiàn)管理控制。
下面我們從不同的角度理解一下驅(qū)動(dòng):
驅(qū)動(dòng)(Device Driver)相當(dāng)于硬件的接口,它維護(hù)著我們的硬件,操作系統(tǒng)通過(guò)驅(qū)動(dòng)這個(gè)接口才能控制硬件。
驅(qū)動(dòng)本身就是一段代碼,自己不會(huì)主動(dòng)運(yùn)行,而是被操作系統(tǒng)調(diào)用執(zhí)行。
驅(qū)動(dòng)是內(nèi)核的一部分,運(yùn)行在內(nèi)核空間。
驅(qū)動(dòng)和應(yīng)用程序有什么關(guān)系?
應(yīng)用程序在運(yùn)行中往往要用到硬件設(shè)備,但應(yīng)用程序不能直接調(diào)用驅(qū)動(dòng)程序,因此要執(zhí)行系統(tǒng)調(diào)用陷入內(nèi)核態(tài)才能調(diào)用驅(qū)動(dòng)。
寫(xiě)驅(qū)動(dòng)需要我們懂哪些知識(shí)?
1,需要熟悉Linux的內(nèi)核機(jī)制
2,驅(qū)動(dòng)程序與應(yīng)用程序的接口
3,需要考慮系統(tǒng)對(duì)設(shè)備的并發(fā)操作
4,需要非常熟悉所開(kāi)發(fā)硬件的工作原理
linux下的驅(qū)動(dòng)千篇一律嗎?
linux系統(tǒng)從各異的設(shè)備中提取共性特征,將其分為三大類(lèi):字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備。
字符設(shè)備驅(qū)動(dòng)是這三類(lèi)中最常見(jiàn)的,而且linux中又有很多基于字符驅(qū)動(dòng)封裝出來(lái)的驅(qū)動(dòng)模型,例如:input設(shè)備、framebuffer設(shè)備、雜項(xiàng)設(shè)備等等,今后學(xué)習(xí)中我們會(huì)有所介紹
每一類(lèi)設(shè)備驅(qū)動(dòng)都有對(duì)應(yīng)的驅(qū)動(dòng)模型框架,降低了驅(qū)動(dòng)編程的復(fù)雜度,大家都遵循固定的框架進(jìn)行編程。
在學(xué)習(xí)linux驅(qū)動(dòng)之前我們要先建立起相關(guān)概念,我們將從以下幾點(diǎn)進(jìn)行學(xué)習(xí):
1.Linux驅(qū)動(dòng)程序的功能
對(duì)硬件進(jìn)行初始化和控制
檢測(cè)和處理硬件出現(xiàn)的錯(cuò)誤
負(fù)責(zé)從硬件讀數(shù)據(jù)和傳送數(shù)據(jù)給硬件設(shè)備
接收應(yīng)用程序發(fā)送的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)
2.驅(qū)動(dòng)程序與應(yīng)用程序的區(qū)別
應(yīng)用程序從頭到尾執(zhí)行完整的任務(wù);驅(qū)動(dòng)程序完成初始化之后不再運(yùn)行,等待應(yīng)用程序調(diào)用執(zhí)行。
應(yīng)用程序可以使用glibc等標(biāo)準(zhǔn)C函數(shù)庫(kù);驅(qū)動(dòng)程序不能使用標(biāo)準(zhǔn)C庫(kù)。
驅(qū)動(dòng)程序是內(nèi)核的一部分,工作在內(nèi)核態(tài);應(yīng)用程序工作在用戶(hù)態(tài)。
3.應(yīng)用程序、庫(kù)、內(nèi)核、驅(qū)動(dòng)程序的關(guān)系
應(yīng)用程序調(diào)用函數(shù)庫(kù)完成一系列功能,一部分庫(kù)函數(shù)通過(guò)系統(tǒng)調(diào)用由內(nèi)核完成相應(yīng)功能,例如:printf、fread函數(shù)等等。
內(nèi)核處理系統(tǒng)調(diào)用,內(nèi)核在實(shí)現(xiàn)系統(tǒng)調(diào)用時(shí)會(huì)根據(jù)需要調(diào)用設(shè)備驅(qū)動(dòng)程序操作硬件。
設(shè)備驅(qū)動(dòng)是硬件設(shè)備的直接控制者,它完成了內(nèi)核和硬件的通信任務(wù)。
4.設(shè)備驅(qū)動(dòng)的種類(lèi)
字符設(shè)備
I/O傳輸過(guò)程中以字符為單位進(jìn)行傳輸;
用戶(hù)對(duì)字符設(shè)備發(fā)出讀/寫(xiě)請(qǐng)求時(shí),實(shí)際的硬件讀/寫(xiě)操作一般緊接著發(fā)生
塊設(shè)備
塊設(shè)備與字符相反,它的數(shù)據(jù)傳輸以塊(內(nèi)存緩沖)為單位傳輸;
用戶(hù)對(duì)塊設(shè)備讀/寫(xiě)時(shí),硬件讀/寫(xiě)不會(huì)緊接著發(fā)生(即用戶(hù)請(qǐng)求和硬件操作是異步的)
磁盤(pán)類(lèi)、閃存類(lèi)等設(shè)備都封裝成塊設(shè)備。
網(wǎng)絡(luò)設(shè)備
網(wǎng)絡(luò)設(shè)備是一類(lèi)特殊的設(shè)備,它不像字符設(shè)備或塊設(shè)備那樣通過(guò)對(duì)應(yīng)的設(shè)備文件訪問(wèn),也不能直接通過(guò)read或write進(jìn)行數(shù)據(jù)請(qǐng)求,而是通過(guò)socket接口函數(shù)進(jìn)行訪問(wèn)。
5.設(shè)備文件和主/從設(shè)備號(hào)
設(shè)備文件是用戶(hù)程序與設(shè)備驅(qū)動(dòng)的一個(gè)接口,應(yīng)用程序通過(guò)操作設(shè)備文件來(lái)調(diào)用設(shè)備驅(qū)動(dòng)程序。
Linux把對(duì)硬件的操作全部抽象成對(duì)文件的操作,其中包含了控制和數(shù)據(jù)傳輸操作,例如:open,read,write,close...
Linux下的各種硬件設(shè)備以文件的形式存放于/dev目錄下,可以使用ls/dev 命令進(jìn)行查看
每個(gè)設(shè)備文件都有其文件屬性(c或者b),表明其是字符設(shè)備還是塊設(shè)備。
每個(gè)設(shè)備文件都有2個(gè)設(shè)備號(hào),在/dev目錄下使用“l(fā)l”或“l(fā)s-l”命令可以查看各個(gè)設(shè)備的設(shè)備類(lèi)型、主/從設(shè)備號(hào)等詳細(xì)信息。
主設(shè)備號(hào):用于標(biāo)識(shí)驅(qū)動(dòng)程序,如果兩個(gè)設(shè)備文件的主設(shè)備號(hào)相同,那他們使用同一個(gè)驅(qū)動(dòng)程序。
從設(shè)備號(hào):用于標(biāo)識(shí)同一驅(qū)動(dòng)程序的不同硬件,為了能把不同的具體硬件分開(kāi),又通過(guò)從設(shè)備號(hào)來(lái)區(qū)分使用相同驅(qū)動(dòng)程序的不同設(shè)備。
例如:210開(kāi)發(fā)板中的串口設(shè)備,主設(shè)備號(hào)標(biāo)識(shí)串口這類(lèi)設(shè)備,從設(shè)備號(hào)標(biāo)識(shí)具體的某個(gè)串口。
用戶(hù)通過(guò)“cat /proc/devices”命令可以查看當(dāng)前系統(tǒng)中主設(shè)備號(hào)的使用情況,以及和硬件設(shè)備的對(duì)應(yīng)情況。
想要了解嵌入式、物聯(lián)網(wǎng)相關(guān)技術(shù)的可以聯(lián)系宋工企鵝號(hào)三五二四六五九零八八Tel:173--1795--1908
試聽(tīng)C語(yǔ)言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。
想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽(tīng)課了。
宋工企鵝號(hào):三五二四六五九零八八 Tel173--1795--1908
|
|