如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711

如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711

ID:41655880

大?。?1.76 KB

頁數(shù):9頁

時(shí)間:2019-08-29

如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711_第1頁
如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711_第2頁
如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711_第3頁
如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711_第4頁
如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711_第5頁
資源描述:

《如何編寫Linux設(shè)備驅(qū)動(dòng)程序39711》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

1、如何編寫Linux設(shè)備驅(qū)動(dòng)程序Linux是Unix操作系統(tǒng)的一種變種,在Linux下編嗎驅(qū)動(dòng)程序的原理和思想完全類似于莫他的Unix系統(tǒng),但它dos或window環(huán)境.卜的驅(qū)動(dòng)程序冇很大的區(qū)別。在Linux環(huán)境卜?設(shè)計(jì)驅(qū)動(dòng)程序,思想簡(jiǎn)潔,操作方便,功能也很強(qiáng)大,但是支持函數(shù)少,只能依賴kernel中的函數(shù),冇些常用的操作要自己來編寫,而且調(diào)試也不方便。一、Linuxdevicedriver的概念系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序Z間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件Z間的接IL設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來,駛件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)

2、用程序口J以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下的功能:k對(duì)設(shè)備初始化和釋放。2o把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。3。讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)(設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分)。4。檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。在Linux操作系統(tǒng)下有三類主要的設(shè)備文件類型,一是字符設(shè)備,二是塊設(shè)備,三是網(wǎng)絡(luò)設(shè)備。字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對(duì)字符設(shè)備發(fā)出讀/寫請(qǐng)求時(shí),實(shí)際的硬件"0(數(shù)據(jù)的輸入/輸出)一般就緊接著發(fā)生了,塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶進(jìn)程對(duì)設(shè)備請(qǐng)求能滿足用戶的要求,就返冋請(qǐng)求的

3、數(shù)據(jù),如果不能,就調(diào)用請(qǐng)求函數(shù)來進(jìn)行實(shí)際的1/0(數(shù)據(jù)的輸入/輸出)操作。塊設(shè)備是主要針對(duì)磁盤等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過多的CPU時(shí)間來等待。已經(jīng)提到,用戶進(jìn)程是通過設(shè)備文件來與實(shí)際的硬件打交道。每個(gè)設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備?另外每個(gè)文件都有兩個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序,第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)備駆動(dòng)程序的不同的碩件設(shè)備,比如有兩個(gè)軟盤,就可以用從設(shè)備號(hào)來區(qū)分他們。設(shè)備文件的的主設(shè)備號(hào)必須與設(shè)備驅(qū)動(dòng)程序在登記時(shí)申請(qǐng)的主設(shè)備號(hào)一致,否則用戶進(jìn)程將無法訪問到驅(qū)動(dòng)程序。最后必須提到的是,在用戶進(jìn)程調(diào)用驅(qū)動(dòng)程序時(shí),系統(tǒng)進(jìn)

4、入核心態(tài),這時(shí)不再是搶先式調(diào)度。也就是說,系統(tǒng)必須在你的驅(qū)動(dòng)程序的子函數(shù)返冋后才能進(jìn)行其他的工作。如果你的驅(qū)動(dòng)程序陷入死循環(huán),不幸的是你只冇重新啟動(dòng)機(jī)器了,然后?就是漫長的fscko讀/寫時(shí),它首先察看緩沖區(qū)的內(nèi)容,如果緩沖區(qū)的數(shù)據(jù)滿,則與緩沖區(qū)中的數(shù)據(jù)交換數(shù)據(jù),如果緩沖區(qū)沒有數(shù)據(jù),則調(diào)用請(qǐng)求函數(shù)來進(jìn)行實(shí)際的I/O操作,待緩沖區(qū)有數(shù)據(jù)后再進(jìn)行操作。二、實(shí)例剖析我們來寫一個(gè)最簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)程序。雖然它什么也不做,但是通過它可以了解Linux的設(shè)備驅(qū)動(dòng)程序的工作原理。把下面的C代碼輸入機(jī)器,你就會(huì)獲得一個(gè)真正的設(shè)備駅動(dòng)程序。#define_NO_VERSION_#incl

5、ude#includecharkerneLversion[]=UTS.RELEASE;〃這個(gè)宏定義擴(kuò)展成字符串,描述了這個(gè)內(nèi)核樹的版本?例如,”2632”.這一段定義了一些版本信息,雖然用處不是很大,但也必不可少。我們建議所有的驅(qū)動(dòng)程序的開頭都要包含,一般來講最好使用。曲于用戶進(jìn)程是通過設(shè)備文件同硬件打交道,對(duì)設(shè)備文件的操作方式不外乎就是一些系統(tǒng)調(diào)用,女口open,read,write,close…,注意,不是fopen,fread,但是如何把系統(tǒng)調(diào)用和駆動(dòng)程序關(guān)聯(lián)起來呢?

6、這需要了解一個(gè)非常關(guān)鍵的數(shù)據(jù)結(jié)構(gòu):structfile_operationsint(*seek)(structinode*,structfileoff_t,int);int(*read)(structinode*,structfile*,char,int);int(*write)(structinode*,structfileoffLt,int);int(*readdir)(structinode*,structfile*>structdirent*,int);int(^select)(structinode*,structfileint,select_table*);i

7、nt(*ioctl)(structinode*,structfileunsinedint,unsignedlong);int(*mmap)(structinode*,structfilestructvm_area_struct*);int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structinode*,structfile*);int(*fasync)(structinode*,structfil

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。