嵌入式系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)_第1頁(yè)
嵌入式系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)_第2頁(yè)
嵌入式系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)_第3頁(yè)
嵌入式系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)_第4頁(yè)
嵌入式系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、設(shè)備驅(qū)動(dòng)程序Device Drivers 嵌入式系統(tǒng)1設(shè)備驅(qū)動(dòng)程序和內(nèi)核接口Linux內(nèi)核必須能夠用標(biāo)準(zhǔn)的方式和設(shè)備驅(qū)動(dòng)程序交互。每一類(lèi)的設(shè)備驅(qū)動(dòng)程序:字符、塊和網(wǎng)絡(luò),都提供了通用的接口供內(nèi)核在需要請(qǐng)求它們的服務(wù)的時(shí)候使用。這些通用的接口意味著內(nèi)核可以完全相同地看待通常是非常不同的設(shè)備和它們的設(shè)備驅(qū)動(dòng)程序。例如,SCSI和IDE磁盤(pán)的行為非常不同,但是Linux內(nèi)核對(duì)它們使用相同的接口。2Linux非常地動(dòng)態(tài),每一次Linux內(nèi)核啟動(dòng),它都可能遇到不同的物理設(shè)備從而需要不同的設(shè)備驅(qū)動(dòng)程序。Linux允許你在建立內(nèi)核時(shí)通過(guò)配置腳本,將設(shè)備驅(qū)動(dòng)程序包含在內(nèi)核中。3在系統(tǒng)啟動(dòng)時(shí),這些設(shè)備驅(qū)動(dòng)程序初始

2、化,此時(shí)它們可能沒(méi)有發(fā)現(xiàn)自己可以控制的任何硬件。其它驅(qū)動(dòng)程序可以在需要的時(shí)候作為內(nèi)核模塊加載。4為了處理設(shè)備驅(qū)動(dòng)程序的這種動(dòng)態(tài)特性,設(shè)備驅(qū)動(dòng)程序要在它們初始化時(shí)向內(nèi)核登記。Linux維護(hù)已經(jīng)登記的設(shè)備驅(qū)動(dòng)程序列表,作為和它們接口的一部分。這些列表包括了例程指針和支持這一類(lèi)設(shè)備的接口信息。5字符設(shè)備字符設(shè)備,Linux中最簡(jiǎn)單的設(shè)備,可以象文件一樣訪問(wèn)。應(yīng)用程序使用標(biāo)準(zhǔn)系統(tǒng)調(diào)用打開(kāi)、讀、寫(xiě)和關(guān)閉字符設(shè)備,完全把它們作為普通文件一樣對(duì)待。甚至正在被PPP守護(hù)進(jìn)程使用,用于將一個(gè)Linux系統(tǒng)連接到網(wǎng)上的modem,也被看作一個(gè)普通文件。當(dāng)字符設(shè)備初始化時(shí),它的設(shè)備驅(qū)動(dòng)程序向Linux內(nèi)核登記,在c

3、hrdevs向量表增加一個(gè)device_struct數(shù)據(jù)結(jié)構(gòu)條目。這個(gè)設(shè)備的主設(shè)備標(biāo)識(shí)符(例如對(duì)于tty設(shè)備是4),用作這個(gè)向量表的索引。一個(gè)設(shè)備的主設(shè)備標(biāo)識(shí)符是固定的。Chrdevs向量表中的每一個(gè)條目,即一個(gè)device_struct數(shù)據(jù)結(jié)構(gòu),包括兩個(gè)元素:一個(gè)是指向登記的設(shè)備驅(qū)動(dòng)程序名字的指針;另一個(gè)是指向一組文件操作的指針。這組文件操作本身位于這個(gè)設(shè)備的字符設(shè)備驅(qū)動(dòng)程序中,每一個(gè)都處理一個(gè)特定的文件操作,比如打開(kāi)、讀、寫(xiě)和關(guān)閉。/proc/devices中字符設(shè)備的內(nèi)容來(lái)自chrdevs向量表6當(dāng)代表一個(gè)字符設(shè)備(例如/dev/cua0)的字符特殊文件打開(kāi)時(shí),內(nèi)核必須做一些事情,從而去

4、調(diào)用正確的字符設(shè)備驅(qū)動(dòng)程序的文件操作例程。和普通文件或目錄一樣,每一個(gè)設(shè)備特殊文件都用VFS I節(jié)點(diǎn)表達(dá)。這個(gè)字符特殊文件的VFS inode(實(shí)際上所有的設(shè)備特殊文件)包含有設(shè)備的major和minor標(biāo)識(shí)符。這個(gè)VFS I節(jié)點(diǎn)由底層的文件系統(tǒng)(例如EXT2)創(chuàng)建,其信息是在查找這個(gè)設(shè)備特殊文件時(shí),由實(shí)際的文件系統(tǒng)提供的。7每一個(gè)VFS I節(jié)點(diǎn)都關(guān)聯(lián)著一組文件操作,它們依賴(lài)于I節(jié)點(diǎn)所代表的文件系統(tǒng)對(duì)象的不同而不同。不管代表一個(gè)字符特殊文件的VFS I節(jié)點(diǎn)什么時(shí)候創(chuàng)建,它的文件操作都被設(shè)置成字符設(shè)備的缺省操作。實(shí)際上只有一種文件操作:open操作。當(dāng)一個(gè)應(yīng)用程序打開(kāi)這個(gè)字符特殊文件時(shí),通用的o

5、pen文件操作使用設(shè)備的主設(shè)備標(biāo)識(shí)符作為chrdevs向量表中的索引,取出這種特殊設(shè)備的文件操作塊。它也建立描述這個(gè)字符特殊文件的file數(shù)據(jù)結(jié)構(gòu),讓它的文件操作指針指向設(shè)備驅(qū)動(dòng)程序中的相應(yīng)操作。然后應(yīng)用程序所有的文件系統(tǒng)操作都被映射到字符設(shè)備的文件操作。 8Linux設(shè)備驅(qū)動(dòng)程序及開(kāi)發(fā)9Linux設(shè)備驅(qū)動(dòng)程序概述Linux設(shè)備驅(qū)動(dòng)程序是處理或操作硬件控制器的軟件,被集成在內(nèi)核中,是常駐內(nèi)存的低級(jí)硬件處理程序的共享庫(kù),設(shè)備驅(qū)動(dòng)程序是系統(tǒng)對(duì)設(shè)備的抽象管理與控制。Linux允許設(shè)備驅(qū)動(dòng)程序作為內(nèi)核可加載模塊實(shí)現(xiàn),即除了可以在系統(tǒng)啟動(dòng)時(shí)進(jìn)行注冊(cè)外,還可以在啟動(dòng)后進(jìn)行加載注冊(cè)。10操作系統(tǒng)的目標(biāo)之一是

6、向用戶(hù)掩蓋系統(tǒng)硬件設(shè)備的特殊性。例如,虛擬文件系統(tǒng)呈現(xiàn)給用戶(hù)一個(gè)統(tǒng)一的文件系統(tǒng)視圖,而和底層的物理設(shè)備無(wú)關(guān)。11CPU不是系統(tǒng)中唯一的智能設(shè)備,每一個(gè)物理設(shè)備都由它自己的硬件控制器。鍵盤(pán)、鼠標(biāo)和串行口由SuperIO芯片控制,IDE磁盤(pán)由IDE控制器控制,SCSI磁盤(pán)由SCSI控制器控制,等等。12每一個(gè)硬件控制器都由自己的控制和狀態(tài)寄存器(CSR),而且不同的設(shè)備有不同的寄存器。CSR用于啟動(dòng)和停止設(shè)備,初始化設(shè)備和診斷它的問(wèn)題。管理這些硬件控制器的代碼不是放在每一個(gè)應(yīng)用程序里邊,而是放在Linux內(nèi)核。這些處理或者管理硬件控制器的軟件叫做設(shè)備驅(qū)動(dòng)程序。13本質(zhì)上,Linux內(nèi)核的設(shè)備驅(qū)動(dòng)程

7、序是特權(quán)的、駐留在內(nèi)存的、低級(jí)硬件控制例程的共享庫(kù)。正是Linux的設(shè)備驅(qū)動(dòng)程序處理它們所管理的設(shè)備的特性。14Linux的一個(gè)基本特點(diǎn)是它抽象了對(duì)設(shè)備的處理。所有的硬件設(shè)備都象常規(guī)文件一樣看待:它們可以使用和操作文件相同的、標(biāo)準(zhǔn)的系統(tǒng)調(diào)用來(lái)打開(kāi)、關(guān)閉和讀寫(xiě)。15系統(tǒng)中的每一個(gè)設(shè)備都用一個(gè)設(shè)備特殊文件代表。例如系統(tǒng)中第一個(gè)IDE硬盤(pán)用/dev/hda表示。對(duì)于塊(磁盤(pán))和字符設(shè)備,這些設(shè)備特殊文件用mknod命令創(chuàng)建,并使用主(major)和次(minor)設(shè)備編號(hào)來(lái)描述設(shè)備。16Linux支持三種類(lèi)型的硬件設(shè)備:字符、塊和網(wǎng)絡(luò)。17Linux有許多不同的設(shè)備驅(qū)動(dòng)程序,它們都具有一些一般的屬性

8、:Kernel code Kenel interfaces Kernel mechanisms and services Loadable Configurable Dynamic 18Kernel code 設(shè)備驅(qū)動(dòng)程序和內(nèi)核中的其它代碼相似,是kenel的一部分,如果發(fā)生錯(cuò)誤,可能?chē)?yán)重?fù)p害系統(tǒng)。一個(gè)粗劣的驅(qū)動(dòng)程序甚至可能摧毀系統(tǒng),可能破壞文件系統(tǒng),丟失數(shù)據(jù)。19Kenel interfaces 設(shè)備驅(qū)動(dòng)程序必須向Linux內(nèi)核或者它所在的子系統(tǒng)提供一個(gè)標(biāo)準(zhǔn)的接口。例如,終端驅(qū)動(dòng)程序向Linux內(nèi)核提供了一個(gè)文件I/O接口,而SCSI設(shè)備驅(qū)動(dòng)程序向SCSI子系統(tǒng)提供了SCSI設(shè)備接口,接著,

9、向內(nèi)核提供了文件I/O和buffer cache的接口。20Kernel mechanisms and services 設(shè)備驅(qū)動(dòng)程序使用標(biāo)準(zhǔn)的內(nèi)核服務(wù),例如內(nèi)存分配、中斷轉(zhuǎn)發(fā)和等待隊(duì)列來(lái)完成工作。21Loadable 大多數(shù)的Linux設(shè)備驅(qū)動(dòng)程序,可以在需要的時(shí)候作為內(nèi)核模塊加載,在不再需要的時(shí)候卸載。這使得內(nèi)核對(duì)于系統(tǒng)資源非常具有適應(yīng)性和效率。22Configurable Linux設(shè)備驅(qū)動(dòng)程序可以建立在內(nèi)核。至于哪些設(shè)備建立到內(nèi)核,可以在內(nèi)核編譯的時(shí)候配置。23Dynamic 在系統(tǒng)啟動(dòng),每一個(gè)設(shè)備啟動(dòng)程序初始化的時(shí)候,它會(huì)查找它管理的硬件設(shè)備。如果一個(gè)設(shè)備驅(qū)動(dòng)程序所控制的設(shè)備不存在并

10、沒(méi)有關(guān)系。這時(shí)這個(gè)設(shè)備驅(qū)動(dòng)程序只是多余的,占用很少的系統(tǒng)內(nèi)存,而不會(huì)產(chǎn)生危害。 24Linux驅(qū)動(dòng)程序開(kāi)發(fā)建立嵌入式Linux平臺(tái),移植和編寫(xiě)驅(qū)動(dòng)程序往往是最具挑戰(zhàn)的工作驅(qū)動(dòng)程序的開(kāi)發(fā)周期一般較長(zhǎng),對(duì)產(chǎn)品的面世時(shí)間有著重要影響驅(qū)動(dòng)程序質(zhì)量的好壞,直接關(guān)系到系統(tǒng)工作效能和穩(wěn)定性,對(duì)項(xiàng)目的成敗起著關(guān)鍵作用25設(shè)備驅(qū)動(dòng)程序主要功能設(shè)備驅(qū)動(dòng)程序主要完成如下功能:檢測(cè)設(shè)備和初始化設(shè)備使設(shè)備投入運(yùn)行和退出服務(wù)從設(shè)備接收數(shù)據(jù)并提交給內(nèi)核從內(nèi)核接收數(shù)據(jù)送到設(shè)備檢測(cè)和處理設(shè)備錯(cuò)誤26Linux設(shè)備驅(qū)動(dòng)程序分類(lèi) Linux中所有設(shè)備被抽象出來(lái),都看成文件 設(shè)備的讀寫(xiě)和普通文件一樣 Linux系統(tǒng)的設(shè)備分為如下三類(lèi)

11、:字符設(shè)備(char device)塊設(shè)備(block device)網(wǎng)絡(luò)設(shè)備(network device)字符設(shè)備是指存取時(shí)沒(méi)有緩存的設(shè)備塊設(shè)備的讀寫(xiě)都有緩存來(lái)支持,且塊設(shè)備必須能夠隨機(jī)存取(random access) 網(wǎng)絡(luò)設(shè)備在Linux里做專(zhuān)門(mén)的處理 27Linux設(shè)備驅(qū)動(dòng)程序分類(lèi)網(wǎng)絡(luò)設(shè)備在Linux里做專(zhuān)門(mén)的處理Linux的網(wǎng)絡(luò)系統(tǒng)主要是基于BSD unix的socket 機(jī)制。在系統(tǒng)和驅(qū)動(dòng)程序之間定義有專(zhuān)門(mén)的數(shù)據(jù)結(jié)構(gòu)(sk_buff)進(jìn)行數(shù)據(jù)的傳遞系統(tǒng)里支持對(duì)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的緩存,提供流量控制機(jī)制,提供對(duì)多協(xié)議的支持 28Linux設(shè)備驅(qū)動(dòng)程序分類(lèi)典型的字符設(shè)備包括鼠標(biāo),鍵盤(pán)

12、,串行口等塊設(shè)備主要包括硬盤(pán)、軟盤(pán)設(shè)備、CD-ROM等一個(gè)文件系統(tǒng)要安裝進(jìn)入操作系統(tǒng)必須在塊設(shè)備上29Linux驅(qū)動(dòng)程序介紹嵌入式Linux驅(qū)動(dòng)已經(jīng)支持的設(shè)備門(mén)類(lèi)齊全,已成為其相對(duì)其他嵌入式操作系統(tǒng)的一大優(yōu)勢(shì)工業(yè)控制常用的串口,并口人機(jī)輸入設(shè)備如鼠標(biāo)、鍵盤(pán),觸摸屏彩色、黑白液晶顯示輸出網(wǎng)絡(luò)的完善支持,包括tcp/ip,udp,firewall,WLAN,ip forwarding,ipsec,vpnUsb的全面支持,包括usb硬盤(pán)、u盤(pán),usb攝像頭支持豐富的文件系統(tǒng),包括FAT32,NTFS30嵌入式設(shè)備框圖31驅(qū)動(dòng)程序的功用1、驅(qū)動(dòng)程序直接操控硬件收發(fā)通訊數(shù)據(jù)讀寫(xiě)存儲(chǔ)介質(zhì),比如flash或

13、硬盤(pán)操作輸出設(shè)備和執(zhí)行機(jī)構(gòu),例如打印,開(kāi)關(guān)門(mén)禁等32驅(qū)動(dòng)程序的功用(續(xù))2、驅(qū)動(dòng)程序提供軟件訪問(wèn)硬件的機(jī)制應(yīng)用軟件通過(guò)驅(qū)動(dòng)程序安全高效的訪問(wèn)硬件驅(qū)動(dòng)程序文件可以方便的提供訪問(wèn)權(quán)限控制驅(qū)動(dòng)程序作為一個(gè)隔離的中間層軟件,將底 層細(xì)節(jié)隱藏起來(lái),提高了軟件的可移植性33訪問(wèn)Linux設(shè)備驅(qū)動(dòng)的方法設(shè)備提供dev文件系統(tǒng)節(jié)點(diǎn)和proc文 件系統(tǒng)節(jié)點(diǎn)應(yīng)用程序通過(guò)dev文件節(jié)點(diǎn)訪問(wèn)驅(qū)動(dòng) 程序應(yīng)用程序通過(guò)proc文件節(jié)點(diǎn)可以查 詢(xún)?cè)O(shè)備驅(qū)動(dòng)的信息34驅(qū)動(dòng)程序位置驅(qū)動(dòng)程序位于drivers目錄下通常驅(qū)動(dòng)程序占kernel代碼的50%Linux設(shè)備驅(qū)動(dòng)程序在Linux的內(nèi)核源代碼中占有很大的比例,源代碼的長(zhǎng)度日益增

14、加,主要是驅(qū)動(dòng)程序的增加。在Linux內(nèi)核的不斷升級(jí)過(guò)程中,驅(qū)動(dòng)程序的結(jié)構(gòu)還是相對(duì)穩(wěn)定。在2.0.xx到2.2.xx的變動(dòng)里,驅(qū)動(dòng)程序的編寫(xiě)做了一些改變,但是從2.0.xx的驅(qū)動(dòng)到2.2.xx的移植只需做少量的工作。 35Linux驅(qū)動(dòng)程序的特點(diǎn)嵌入式Linux驅(qū)動(dòng)程序需求多樣嵌入式設(shè)備硬件各異嵌入式計(jì)算平臺(tái)往往資源有限,比如處理速度、存儲(chǔ)器容量、總線帶寬、電池容量等通常要求短的開(kāi)發(fā)周期、壓力大開(kāi)發(fā)驅(qū)動(dòng)程序需要豐富的專(zhuān)業(yè)知識(shí),包括 硬件和軟件知識(shí)36嵌入式Linux驅(qū)動(dòng)程序特點(diǎn)嵌入式系統(tǒng)硬件更新速度加快國(guó)際上大的嵌入式芯片提供商如Intel、 Samsung、Freescale、TI、ST每年

15、都有大量新品推出新的芯片功能總是需要相應(yīng)的驅(qū)動(dòng)程序支持37Linux驅(qū)動(dòng)開(kāi)發(fā)流程 熟悉設(shè)備的特性 確定設(shè)備驅(qū)動(dòng)程序類(lèi)別 編寫(xiě)測(cè)試用例 搜集可重用的代碼 編寫(xiě)自己的驅(qū)動(dòng)程序代碼 編碼、調(diào)試、測(cè)試38Linux驅(qū)動(dòng)程序的開(kāi)發(fā)環(huán)境本機(jī)編譯調(diào)試開(kāi)發(fā)環(huán)境配置簡(jiǎn)單無(wú)需網(wǎng)絡(luò)環(huán)境適用于配置較高的x86機(jī)器主機(jī)+目標(biāo)機(jī)主機(jī)可以自由選擇Linux主機(jī)和目標(biāo)機(jī)通過(guò)網(wǎng)絡(luò)共享文件系統(tǒng)內(nèi)核崩潰不會(huì)影響主機(jī)39Linux驅(qū)動(dòng)程序的開(kāi)發(fā)環(huán)境(續(xù))主機(jī)+目標(biāo)機(jī)環(huán)境包括主機(jī)運(yùn)行的工具鏈cross gcc + glibc + gdb, 如果是windows主機(jī)還要有cygwin仿真環(huán)境主機(jī)運(yùn)行遠(yuǎn)程服務(wù),常用的有tftp用來(lái)傳送內(nèi)

16、核映像、initrd,NFS用來(lái)共享文件系統(tǒng)目標(biāo)機(jī)運(yùn)行ssh或telnet等遠(yuǎn)程登陸服務(wù),用來(lái) 調(diào)試驅(qū)動(dòng)程序40Linux驅(qū)動(dòng)程序的加載方式驅(qū)動(dòng)程序直接編譯入內(nèi)核驅(qū)動(dòng)程序在內(nèi)核啟動(dòng)時(shí)就已經(jīng)在內(nèi)存中可以保留專(zhuān)用存儲(chǔ)器空間驅(qū)動(dòng)程序以模塊形式存儲(chǔ)在文件系 統(tǒng)里,需要時(shí)動(dòng)態(tài)載入內(nèi)核驅(qū)動(dòng)程序按需加載,不用時(shí)節(jié)省內(nèi)存驅(qū)動(dòng)程序相對(duì)獨(dú)立于內(nèi)核,升級(jí)靈活41Linux驅(qū)動(dòng)程序模塊加載42Linux驅(qū)動(dòng)程序開(kāi)發(fā)的任務(wù)規(guī)劃硬件資源的使用分離硬件相關(guān)和硬件無(wú)關(guān)的代碼劃分驅(qū)動(dòng)程序的抽象層次移植驅(qū)動(dòng)程序到新的平臺(tái)43Linux驅(qū)動(dòng)程序開(kāi)發(fā)的任務(wù)規(guī)劃硬件資源的使用CPU時(shí)間片分配中斷處理系統(tǒng)存儲(chǔ)器空間映射44Linux驅(qū)動(dòng)

17、程序開(kāi)發(fā)的任務(wù)分離硬件相關(guān)和硬件無(wú)關(guān)的代碼劃分驅(qū)動(dòng)程序的抽象層次45Linux驅(qū)動(dòng)程序開(kāi)發(fā)的任務(wù)移植驅(qū)動(dòng)程序到新的平臺(tái)46設(shè)備驅(qū)動(dòng)程序的代碼驅(qū)動(dòng)程序的注冊(cè)與注銷(xiāo)register_chrdev()register_blkdev()設(shè)備的打開(kāi)與釋放open()release()設(shè)備的讀寫(xiě)操作read()write()設(shè)備的控制操作ioctl()47設(shè)備驅(qū)動(dòng)的加載使用模塊的方式動(dòng)態(tài)加載驅(qū)動(dòng)int func_init(void) Makefile:insmod xx.olsmodrmmod xx.o將驅(qū)動(dòng)靜態(tài)編譯到內(nèi)核里面 int _init func_init(void) Makefile:啟動(dòng)時(shí)自

18、動(dòng)加載48內(nèi)核模塊 模塊是內(nèi)核的一部分,但是并沒(méi)有被編譯到內(nèi)核里去。它們被分別編譯和連接成目標(biāo)文件。 用命令insmod插入一個(gè)模塊到內(nèi)核中,用命令rmmod卸載一個(gè)模塊 在Linux內(nèi)核中,以下內(nèi)容一般編譯成模塊:大多數(shù)的驅(qū)動(dòng)程序。包括SCSI設(shè)備,CD-ROM,網(wǎng)絡(luò)設(shè)備,不常用的字符設(shè)備,如打印機(jī)等。大多數(shù)文件系統(tǒng),理論上除了根文件系統(tǒng)不能是模塊,其他文件系統(tǒng)都可以是模塊。一些內(nèi)核支持的不常用的可執(zhí)行文件格式,如binfmt_misc。49驅(qū)動(dòng)源代碼50驅(qū)動(dòng)源代碼51驅(qū)動(dòng)源代碼52驅(qū)動(dòng)源代碼53驅(qū)動(dòng)源代碼54編譯驅(qū)動(dòng)程序55應(yīng)用程序56編譯應(yīng)用程序57背景知識(shí): Linux設(shè)備管理58主要

19、內(nèi)容概述驅(qū)動(dòng)程序基礎(chǔ)中斷處理輔助函數(shù)設(shè)備驅(qū)動(dòng)程序模塊編程基礎(chǔ)字符設(shè)備塊設(shè)備網(wǎng)絡(luò)設(shè)備59概述輸入輸出子系統(tǒng): 下層:設(shè)備驅(qū)動(dòng)程序 上層:設(shè)備無(wú)關(guān)部分60設(shè)備管理總體結(jié)構(gòu)示意用戶(hù)程序系統(tǒng)調(diào)用接口文件系統(tǒng)高速緩存字符設(shè)備塊設(shè)備驅(qū)動(dòng)程序硬件設(shè)備61輸入輸出系統(tǒng)層次結(jié)構(gòu)用戶(hù)進(jìn)程設(shè)備無(wú)關(guān)軟件設(shè)備驅(qū)動(dòng)程序設(shè)備服務(wù)子程序中斷處理程序硬件I/O請(qǐng)求I/O應(yīng)答進(jìn)行I/O調(diào)用;格式化I/O命名、保護(hù)、阻塞、緩沖、分配建立設(shè)備寄存器、檢測(cè)狀態(tài)I/O結(jié)束時(shí),喚醒設(shè)備服務(wù)子程序執(zhí)行I/O操作62驅(qū)動(dòng)程序基礎(chǔ)命名空間并行設(shè)備:lp軟盤(pán):fdSCSI盤(pán):sdIDE硬盤(pán):hda1, hda2, hdb等網(wǎng)絡(luò)設(shè)備:ethn, s

20、lipn, pppn等在寫(xiě)驅(qū)動(dòng)程序的時(shí)候,需要給函數(shù)名加上選擇的前綴來(lái)避免任何混淆。如:foo_read(),foo_write()等。 63驅(qū)動(dòng)程序基礎(chǔ)內(nèi)存分配函數(shù)kmalloc()內(nèi)存以2的冪大小的塊分配 有一個(gè)優(yōu)先級(jí)參數(shù)宏kfree()和函數(shù)kfree_s()kfree()調(diào)用kfree_s(),和free()一樣工作可以直接調(diào)用kfree_s(),但是需要知道釋放內(nèi)存塊的大小64驅(qū)動(dòng)程序基礎(chǔ)設(shè)備分類(lèi)字符設(shè)備:不使用緩沖區(qū),順序讀寫(xiě)foo_read() & foo_write()塊設(shè)備:需要使用緩沖區(qū),隨機(jī)讀寫(xiě)策略規(guī)程網(wǎng)絡(luò)設(shè)備采用了特殊的處理方法。65驅(qū)動(dòng)程序基礎(chǔ)設(shè)備號(hào)主設(shè)備號(hào)&次設(shè)備號(hào)

21、主設(shè)備號(hào)相同的設(shè)備使用相同的驅(qū)動(dòng)程序次設(shè)備號(hào)區(qū)分具體設(shè)備的實(shí)例命令:ls l /dev/had*66驅(qū)動(dòng)程序基礎(chǔ)DMA方式用于傳送大規(guī)模的數(shù)據(jù)PC機(jī)上的ISA DMA控制器8條DMA通道。每條通道聯(lián)系著一個(gè)16位地址寄存器和16位計(jì)數(shù)器DMA直接訪問(wèn)物理內(nèi)存DMA通道不能被共享。一些設(shè)備擁有固定的DMA通道。Struct dma_chan結(jié)構(gòu):每個(gè)通道擁有一個(gè)此結(jié)構(gòu)兩個(gè)域:指向該通道擁有者的字符串指針 指示該通道是否已分配的標(biāo)志67驅(qū)動(dòng)程序基礎(chǔ)睡眠喚醒機(jī)制TASK_INTERRUPTIBLE TASK_UNITERUPTIBLE,決定于睡眠是否能夠被系統(tǒng)調(diào)用一類(lèi)的事情打斷。一般來(lái)說(shuō),如果設(shè)備比

22、較慢、可以被無(wú)限阻塞,包括終端、網(wǎng)絡(luò)設(shè)備或偽設(shè)備,睡眠應(yīng)該是可中斷的 _sleep_on()Struct wait_queuestruct task_struct *task; struct wait_queue *next; ;68驅(qū)動(dòng)程序基礎(chǔ)設(shè)備文件Struct file結(jié)構(gòu)include/linux/fs.h增加一個(gè)設(shè)備時(shí)需要用mknod命令為該設(shè)備創(chuàng)建一個(gè)inode69驅(qū)動(dòng)程序基礎(chǔ)lseek():轉(zhuǎn)到所需的偏移。 struct inode *inode 指向此設(shè)備inode結(jié)構(gòu)的指針。 Struct file *file 指向此設(shè)備的文件結(jié)構(gòu)的指針。 Off_t offset 要轉(zhuǎn)移到

23、的相對(duì)origin指示的基準(zhǔn)的偏移地址。 Int origin 0 = 采用相對(duì)于絕對(duì)地址0(開(kāi)始)的偏移量。 1 = 采用相對(duì)于當(dāng)前位置的偏移量。 2 = 采用相對(duì)于末尾的偏移量。 Lseek()在出錯(cuò)是返回出錯(cuò)碼 errno,否則返回lseek操作以后的絕對(duì)地址(=0)。 70read()和write()struct inode *inode:指向代表要訪問(wèn)的設(shè)備的特殊文件的指針。sturct file *file:指向該設(shè)備的文件結(jié)構(gòu)的指針。 Char *buf:一個(gè)讀寫(xiě)的字符緩沖區(qū)。位于用戶(hù)空間內(nèi)存中,可以用get_fs*(),put_fs*()和memcpy*fs()訪問(wèn)。 Int

24、count:緩沖區(qū)中讀或?qū)懙淖址挠?jì)數(shù)。它是buf的大小,也是知道怎樣到達(dá)buf的末尾的手段,因?yàn)閎uf是沒(méi)有保證以NULL結(jié)尾的。 71Select()struct inode *inode:指向該設(shè)備的inode結(jié)構(gòu)的指針。 Struct file *file:指向設(shè)備的文件結(jié)構(gòu)的指針。 Int sel_type:可以執(zhí)行的選擇類(lèi)型 SEL_IN read SEL_OUT write SEL_EX exception Select_table *wait 如果設(shè)備沒(méi)有準(zhǔn)備好,調(diào)用select_wait(),并且返回0。 如果設(shè)備準(zhǔn)備好,返回1。 72ioctl()函數(shù):處理ioctl調(diào)用。

25、結(jié)構(gòu):首先差錯(cuò)檢查,然后用一個(gè)大的switch語(yǔ)句來(lái)處理所有可能的ioct。參數(shù): Struct inode *inode Struct file *file Unsigned int cmd :ioctl命令。一般用于做case語(yǔ)句的switch參數(shù)。 Unsigned int arg 這是此命令的參數(shù),由用戶(hù)定義。返回: 出錯(cuò)返回-error。 其他情況下返回由用戶(hù)定義。73mmap()函數(shù)Struct inode *inode Struct file *file Unsigned long addr 需要映射進(jìn)入的主存開(kāi)始地址。Size_t len 需要映射的存儲(chǔ)空間長(zhǎng)度。Int pro

26、t 下面中的一個(gè): PROT_READ 可以讀的區(qū)域。 PROT_WRITE 可寫(xiě)的區(qū)域 PROT_EXEC 可執(zhí)行的區(qū)域 PROT_NONE 不可訪問(wèn)的區(qū)域 Unsigned long off 需要映射的文件偏移地址。這個(gè)地址將被映射到addr。 74 open()和release()函數(shù) Struct inode *inode 指向此設(shè)備的inode結(jié)構(gòu)的指針。 Struct file *file 指向此設(shè)備的文件結(jié)構(gòu)的指針。 Open()在設(shè)備特殊文件打開(kāi)時(shí)調(diào)用。是用來(lái)保證一致性的策略機(jī)制。 Release()只在進(jìn)程關(guān)閉它打開(kāi)的最后一個(gè)文件描述子的時(shí)候調(diào)用? 75init()函數(shù)內(nèi)核第

27、一次啟動(dòng)時(shí)調(diào)用: 在正確的位置調(diào)用init(): 字符設(shè)備drivers/char/mem.c中的chr_dev_init() 把注冊(cè)到VFS中: 對(duì)于字符設(shè)備register_chrdev() 打印關(guān)于設(shè)備的信息,并且報(bào)告找到的硬件 printk() 76模塊編程基礎(chǔ)模塊的基本概念: 可以動(dòng)態(tài)的加載到內(nèi)核中成為kernel的一部分;加載后可以訪問(wèn)內(nèi)核的數(shù)據(jù)結(jié)構(gòu); 用戶(hù)空間的程序或進(jìn)程可以通過(guò)某個(gè)模塊和內(nèi)核交互。module在需要的時(shí)可通過(guò)符號(hào)表(symbol table)使用核心資源。 而且module一般需要調(diào)用核心的資源,所以必須注意module的版本和核心的版本的相配問(wèn)題。一般在mod

28、ule的裝入過(guò)程中檢查module的版本信息。 77模塊之間的函數(shù)調(diào)用 內(nèi)核可以使用其它模塊或內(nèi)核的函數(shù),也可以export一些函數(shù)供其他模塊或內(nèi)核使用。 模塊棧:如果模塊A使用了模塊B的函數(shù),那么B必須在A之前加載,否則加載A的命令不成功。模塊可以使用的函數(shù): 自身定義; 其他module提供; 內(nèi)核提供命令ksyms a:列出已經(jīng)加載的模塊的函數(shù)或變量。Symbol table:記錄module導(dǎo)出的函數(shù)或變量。所有聲明為global的函數(shù)或變量都意味著被導(dǎo)出,可以被其他模塊使用。78模塊編程基礎(chǔ)常用命令lsmod 把現(xiàn)在 kernel 中已經(jīng)安裝的modules 列出來(lái)insmod 把某

29、個(gè) module 安裝到 kernel 中。rmmod 把某個(gè)沒(méi)在用的 module 從kerne中卸載。depmod 制造 module dependency file,以告訴將來(lái)的 insmod 要去哪兒找modules 來(lái)安裝。這個(gè) dependency file放在 /lib/modules/當(dāng)前kernel版本/modules.dep。 79設(shè)備驅(qū)動(dòng)程序框架接口Linux設(shè)備驅(qū)動(dòng)程序與外界的接口 1.設(shè)備驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口,通過(guò)(include/linux/fs.h)完成。 2.驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口,初始化設(shè)備。 3.驅(qū)動(dòng)程序與設(shè)備的接口。與具體設(shè)備相關(guān)。80驅(qū)動(dòng)程序框架功能驅(qū)動(dòng)程序的注冊(cè)與注銷(xiāo)設(shè)備的打開(kāi)與釋放設(shè)備的讀寫(xiě)操作設(shè)備的控制操作設(shè)備的中斷和輪詢(xún)處理81注冊(cè)與注銷(xiāo)注冊(cè)和注銷(xiāo)函數(shù):register_*dev()unregister_*dev()/include/linux/fs.h所謂注冊(cè)就是在內(nèi)核的chrdevs或blkdevs中添加一項(xiàng)。 struct device_struct const char * name; struct * fops; ;相同主設(shè)備號(hào)的fops元素內(nèi)容相同。82打開(kāi)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論