![嵌入式Linux操作系統(tǒng)的驅(qū)動(dòng)程序開(kāi)發(fā)要點(diǎn)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/6/0e41c058-adfa-4365-b695-96575c566e7f/0e41c058-adfa-4365-b695-96575c566e7f1.gif)
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式linux操作系統(tǒng)的驅(qū)動(dòng)程序開(kāi)發(fā)要點(diǎn)在操作系統(tǒng)下有3類(lèi)主要的設(shè)備文件類(lèi)型:塊設(shè)備、字符設(shè)備和網(wǎng)絡(luò)設(shè)備。這種分類(lèi)辦法可以將控制輸入/輸出設(shè)備的驅(qū)動(dòng)程序與其他操作系統(tǒng)軟件分別開(kāi)來(lái)。字符設(shè)備與塊設(shè)備的主要區(qū)分是:在對(duì)字符設(shè)備發(fā)出讀/寫(xiě)哀求時(shí),實(shí)際的硬件i/o普通緊接著發(fā)生。塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),若用戶(hù)進(jìn)程對(duì)設(shè)備的哀求能滿(mǎn)足用戶(hù)的要求,就返回哀求的數(shù)據(jù);否則,就調(diào)用哀求函數(shù)來(lái)舉行實(shí)際的i/o操作。塊設(shè)備主要是針對(duì)磁盤(pán)等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過(guò)多的cpu時(shí)光用來(lái)等待。網(wǎng)絡(luò)設(shè)備可以通過(guò)bsd套接口拜訪(fǎng)數(shù)據(jù)。每個(gè)設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備。另外每
2、個(gè)文件都有2個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序;其次個(gè)是從設(shè)備號(hào),標(biāo)識(shí)用法同一個(gè)設(shè)備驅(qū)動(dòng)程序的、不同的硬件設(shè)備。設(shè)備文件的主設(shè)備號(hào)必需與設(shè)備驅(qū)動(dòng)程序在記下時(shí)申請(qǐng)的主設(shè)備號(hào)全都,否則用戶(hù)進(jìn)程將無(wú)法拜訪(fǎng)驅(qū)動(dòng)程序。系統(tǒng)調(diào)用時(shí)操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核與機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下功能:對(duì)設(shè)備初始化和釋放把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序哀求的數(shù)據(jù)檢測(cè)和處理設(shè)備浮現(xiàn)的錯(cuò)誤mtd(memory technology device)設(shè)備是閃存芯片、小型閃存卡、記憶棒之類(lèi)的設(shè)備,它們?cè)谠O(shè)備
3、中的用法正在不斷增強(qiáng)。mtd驅(qū)動(dòng)程序是在linux下特地為嵌入式環(huán)境開(kāi)發(fā)的新的一類(lèi)驅(qū)動(dòng)程序。相對(duì)于常規(guī)塊設(shè)備驅(qū)動(dòng)程序,用法mtd驅(qū)動(dòng)程序的優(yōu)點(diǎn)在于他們能更好的支持、管理賦予閃存設(shè)備,有基于扇區(qū)的擦除和讀/寫(xiě)操作的更好的接口。一 驅(qū)動(dòng)程序結(jié)構(gòu)linux的設(shè)備驅(qū)動(dòng)程序可以分為3個(gè)主要組成部分:1. 自動(dòng)配置和初始化子程序,負(fù)責(zé)監(jiān)測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和能否正常工作。假如該設(shè)備正常,則對(duì)這個(gè)設(shè)備及其相關(guān)的設(shè)備驅(qū)動(dòng)程序需要的軟件狀態(tài)舉行初始化。這部分驅(qū)動(dòng)程序僅在初始化時(shí)被調(diào)用一次。2. 服務(wù)于i/o哀求的子程序,又稱(chēng)為驅(qū)動(dòng)程序的上半部分。調(diào)用這部分程序是因?yàn)橄到y(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行時(shí),系
4、統(tǒng)仍認(rèn)為是與舉行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶(hù)態(tài)變成了核心態(tài),具有舉行此系統(tǒng)調(diào)用的用戶(hù)程序的運(yùn)行環(huán)境,因而可以在其中調(diào)用sleep()等與舉行運(yùn)行環(huán)境有關(guān)的函數(shù)。3. 中斷服務(wù)子程序,又稱(chēng)為驅(qū)動(dòng)程序的下半部分。在linux系統(tǒng)中,并不是挺直從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)子程序,而是由linux系統(tǒng)來(lái)接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以在任何一個(gè)進(jìn)程運(yùn)行時(shí)產(chǎn)生,因而在中斷服務(wù)程序被調(diào)用時(shí),不能依靠于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。由于設(shè)備驅(qū)動(dòng)程序普通支持同一類(lèi)型的若干設(shè)備,所以普通在系統(tǒng)調(diào)用中斷服務(wù)子程序時(shí),都帶有一個(gè)或多個(gè)參數(shù),以唯一標(biāo)識(shí)
5、哀求服務(wù)的設(shè)備。在系統(tǒng)內(nèi)部,i/o設(shè)備的存/取通過(guò)一組固定的入口點(diǎn)來(lái)舉行,這組入口點(diǎn)是由每個(gè)設(shè)備的驅(qū)動(dòng)程序提供的。詳細(xì)到linux系統(tǒng),設(shè)備驅(qū)動(dòng)程序所提供的這組入口點(diǎn)由一個(gè)文件操作結(jié)構(gòu)來(lái)向系統(tǒng)舉行解釋。file_operation結(jié)構(gòu)定義于linux/fs.h文件中。struct file_operationint (*lseek)(struct inode *inode, struct file *filp, off_t off, int pos);int (*read)(struct inode *inode, struct file *filp, char *buf, int count
6、);int (*write)(struct inode *inode, struct file *filp, const char *buf, int count);int (*readdir)(struct inode *inode, struct file *filp, struct dirent *dirent, int count);int (*select)(struct inode *inode, struct file *filp, int sel_type, select_table *wait);int (*ioctl)(struct inode *inode, struct
7、 file *filp, unsigned int cmd, unsigned int arg);int (*mmap)(void);int (*open)(struct inode *inode, struct file *filp);int (*release)(struct inode *inode, struct file *filp);int (*fasync)(struct inode *inode, struct file *filp);file_operation結(jié)構(gòu)中的成員幾乎所有是函數(shù)指針,所以實(shí)質(zhì)上就是函數(shù)跳轉(zhuǎn)表。每個(gè)進(jìn)程對(duì)設(shè)備的操作都會(huì)按照major、minor設(shè)備號(hào),
8、轉(zhuǎn)換成對(duì)file_operation結(jié)構(gòu)的拜訪(fǎng)。常用的操作包括以下幾種:lseek, 移動(dòng)文件指針的位置,只能用于可以隨機(jī)存取的設(shè)備。read, 舉行讀操作,參數(shù)buf為存放讀取結(jié)果的緩沖區(qū),count為所要讀取的數(shù)據(jù)長(zhǎng)度。返回值為負(fù)表示讀取操作發(fā)生錯(cuò)誤;否則,返回實(shí)際讀取的字節(jié)數(shù)。對(duì)于字符型,要求讀取的字節(jié)數(shù)和返回的實(shí)際讀取字節(jié)數(shù)都必需是inode-i_blksize的倍數(shù)。write, 舉行寫(xiě)操作,與read類(lèi)似readdir, 取得下一個(gè)名目入口點(diǎn),惟獨(dú)與文件系統(tǒng)相關(guān)的設(shè)備程序才用法。select, 舉行挑選操作。假如驅(qū)動(dòng)程序沒(méi)有提供select入口,select操作會(huì)認(rèn)為設(shè)備已經(jīng)預(yù)備好
9、舉行任何i/o操作。ioctl, 舉行讀、寫(xiě)以外的其他操作,參數(shù)cmd為自定義的指令mmap, 用于把設(shè)備的內(nèi)容映射到地址空間,普通惟獨(dú)塊設(shè)備驅(qū)動(dòng)程序用法open, 打開(kāi)設(shè)備預(yù)備舉行i/o操作。返回0表示打開(kāi)勝利,返回負(fù)數(shù)表示失敗。假如驅(qū)動(dòng)程序沒(méi)有提供open入口,則只要/dev/driver文件存在就認(rèn)為打開(kāi)勝利。release, 即close操作。在用戶(hù)自己的驅(qū)動(dòng)程序中,首先要按照驅(qū)動(dòng)程序的功能,完成file_operation結(jié)構(gòu)中函數(shù)實(shí)現(xiàn)。不需要的函數(shù)接口可以挺直在file_operation結(jié)構(gòu)中初始化為null。file_operation變量會(huì)在驅(qū)動(dòng)程序初始化時(shí)注冊(cè)到系統(tǒng)內(nèi)部。當(dāng)
10、操作系統(tǒng)對(duì)設(shè)備操作時(shí),會(huì)調(diào)用驅(qū)動(dòng)程序注冊(cè)的file_operation結(jié)構(gòu)中的函數(shù)指針。二 linux對(duì)中斷的處理在linux系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心部分,因而假如設(shè)別與系統(tǒng)之間以中斷方式舉行數(shù)據(jù)交換,就必需把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分。設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用request_irq函數(shù)來(lái)申請(qǐng)中斷,通過(guò)free_irq來(lái)釋放中斷。它們被定義為:includeint request_irq(unsigned int irq,void (*handler)(int irq, void dev_id, struct pt_regs *regs),unsigned long flags
11、,const char *device,void *dev_id);void free_irq(unsigned int irq, void *dev_id);參數(shù)irq表示所要申請(qǐng)的硬件中斷號(hào);handler為向系統(tǒng)記下的中斷處理子程序,中斷產(chǎn)生時(shí)由系統(tǒng)來(lái)調(diào)用,調(diào)用時(shí)所 帶參數(shù)irq為中斷號(hào);dev_id為申請(qǐng)時(shí)告知系統(tǒng)的設(shè)備標(biāo)識(shí);regs為中斷發(fā)生時(shí)的寄存器內(nèi)容;device為設(shè)備名,將會(huì)浮現(xiàn)在/proc/interrupts文件里;flag是申請(qǐng)時(shí)的選項(xiàng),它打算中斷處理程序的一些特性,其中最重要的是中斷處理程序是迅速處理程序還是慢速處理程序。迅速處理程序運(yùn)行時(shí),全部中斷都被屏蔽,而慢速處理程序運(yùn)行時(shí),除了正在處理的中斷外,其他中斷都沒(méi)有被屏蔽。在linux系統(tǒng)中,中斷可以被不同的中斷處理程序分享。作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用malloc和free,而代之以調(diào)用kmallo
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度大數(shù)據(jù)應(yīng)用合作合同免責(zé)條款范本
- 2025年度消防設(shè)備檢測(cè)檢驗(yàn)服務(wù)合同
- 2025年度還建房屋產(chǎn)權(quán)互換合同模板
- 2025年度國(guó)有股權(quán)掛牌轉(zhuǎn)讓與投資基金協(xié)議轉(zhuǎn)讓服務(wù)合同
- 現(xiàn)代物流信息技術(shù)的教育推廣與實(shí)踐
- 2025年度跨境電商物流倉(cāng)儲(chǔ)服務(wù)合同
- 2025年度跨境電子商務(wù)平臺(tái)擔(dān)保購(gòu)銷(xiāo)合同范例
- 2025年度合伙人股權(quán)優(yōu)先購(gòu)買(mǎi)權(quán)協(xié)議模板
- 2025年度供熱管網(wǎng)改造供用熱合同詳細(xì)條款
- 2025年度空壓機(jī)租賃服務(wù)與設(shè)備更新協(xié)議
- 學(xué)校預(yù)算管理內(nèi)部控制制度
- anthone溫控儀說(shuō)明書(shū)LU920
- 童年創(chuàng)傷問(wèn)卷(CTQ-含評(píng)分說(shuō)明)
- 人教部編版小學(xué)五年級(jí)語(yǔ)文下冊(cè) 第三單元綜合性學(xué)習(xí)《我愛(ài)你,漢字》優(yōu)質(zhì)課教案
- 工廠(chǎng)主文件(新)
- 樓板配筋計(jì)算表格(自動(dòng)版)
- 儀表基礎(chǔ)知識(shí)培訓(xùn).ppt課件
- 井下探放水設(shè)計(jì)編制培訓(xùn)PPT課件
- 營(yíng)養(yǎng)學(xué)緒論(精)
- 魯科版英語(yǔ)五年級(jí)下冊(cè)Unit 5 單元測(cè)試卷及答案
- 最新ICD-9手術(shù)編碼
評(píng)論
0/150
提交評(píng)論