版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 十 章 內(nèi)核驅(qū)動(dòng)設(shè)計(jì)入門,嵌入式系統(tǒng)及其軟件工具,本章提要,10.1 驅(qū)動(dòng)程序概述,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。所有對(duì)設(shè)備的操作都必須由被控設(shè)備相關(guān)的代碼驅(qū)動(dòng)程序來完成。 設(shè)備驅(qū)動(dòng)隱藏了設(shè)備的具體細(xì)節(jié),為不同設(shè)備提供了統(tǒng)一的訪問接口。用戶或者應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,設(shè)備驅(qū)動(dòng)是內(nèi)核的一部分。,10.1.1 設(shè)備驅(qū)動(dòng)功能,設(shè)備的初始化和釋放 負(fù)責(zé)內(nèi)核與外設(shè)之間的數(shù)據(jù)交換 提供各類設(shè)備服務(wù) 檢測(cè)和處理設(shè)備工作過程中出現(xiàn)的錯(cuò)誤,驅(qū)動(dòng)程序在嵌入式Linux中的作用:,在嵌入式系統(tǒng)中,要訪問某個(gè)特定的硬件,實(shí)際上就是訪問物理的地址空間(處理器內(nèi)的寄存器、外
2、設(shè)的地址映像)。然而,由于MMU的內(nèi)存映射以及對(duì)操作系統(tǒng)的保護(hù),運(yùn)行在用戶態(tài)的應(yīng)用程序一般不能夠直接訪問硬件地址,因此需要驅(qū)動(dòng)程序作為應(yīng)用程序和訪問硬件之間的媒介。 某些驅(qū)動(dòng)程序并不能直接給應(yīng)用程序調(diào)用,而是給Linux內(nèi)核調(diào)用。例如:串口作為console的物理載體;或者驅(qū)動(dòng)程序由操作系統(tǒng)調(diào)用,應(yīng)用程序可以間接的使用驅(qū)動(dòng)程序,如framebuffer,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)等。(要去哦球驅(qū)動(dòng)程序必須按照某個(gè)框架編寫,供上層模塊使用),10.1.2 驅(qū)動(dòng)程序開發(fā)注意,開發(fā)驅(qū)動(dòng)程序和開發(fā)應(yīng)用程序不同; 驅(qū)動(dòng)程序應(yīng)提供盡量多的選項(xiàng)給用戶,不應(yīng)該強(qiáng)加約束; 盡量提高驅(qū)動(dòng)程序的速度、效率,盡量簡(jiǎn)化,便于維護(hù)。,
3、10.2 Linux設(shè)備與設(shè)備驅(qū)動(dòng),Linux把設(shè)備分成3類,每類設(shè)備有自己的接口和常用框架,他們也有很多共性。,字符設(shè)備:采用字符流方式訪問的設(shè)備,每次只傳輸一個(gè)字符。 特點(diǎn):順序訪問。鼠標(biāo)、鍵盤、串口等。 塊設(shè)備:采用隨機(jī)訪問的方式訪問,數(shù)據(jù)具有固定大小的塊的設(shè)備;(Linux中塊設(shè)備與字符設(shè)備使用基本一致) 特點(diǎn):緩沖存儲(chǔ),隨機(jī)訪問。硬盤、光盤等。 網(wǎng)絡(luò)設(shè)備:采用數(shù)據(jù)包傳輸方式訪問的設(shè)備。 特點(diǎn):與字符設(shè)備和塊設(shè)備不同,沒有設(shè)備文件。通過socket進(jìn)行使用。,設(shè) 備,設(shè)備的分類,10.2.1 Linux設(shè)備和設(shè)備驅(qū)動(dòng),設(shè)備驅(qū)動(dòng)的共性: 設(shè)備驅(qū)動(dòng)工作在內(nèi)核態(tài),誤操作后果很嚴(yán)重; 設(shè)備驅(qū)動(dòng)
4、必須提供一個(gè)標(biāo)準(zhǔn)的內(nèi)核接口,字符和塊設(shè)備采用文件接口,網(wǎng)絡(luò)設(shè)備采用套接字; 驅(qū)動(dòng)可以采用標(biāo)準(zhǔn)的內(nèi)核服務(wù),如:“內(nèi)存分配”、等待隊(duì)列、中斷機(jī)制等; 驅(qū)動(dòng)可以動(dòng)態(tài)的連接到內(nèi)核中,不用時(shí)可以卸載。也可將驅(qū)動(dòng)編譯到內(nèi)核中。,10.2.1 Linux設(shè)備和設(shè)備驅(qū)動(dòng),10.2.2 Linux設(shè)備文件,bash# ls -l /dev 查看相關(guān)設(shè)備信息 crw- 1 root root 14, 3Jan30 2003 dsp crw-rw- 1 root floppy 2, 0Jan30 2003 fd0,系統(tǒng)啟動(dòng)時(shí)會(huì)把設(shè)備文件系統(tǒng)掛載在/dev目錄下,linux的設(shè)備文件的創(chuàng)建、刪除和目錄層次等都由各設(shè)備
5、驅(qū)動(dòng)程序管理。/dev中每個(gè)文件都動(dòng)態(tài)的對(duì)應(yīng)了一個(gè)系統(tǒng)上存在的設(shè)備驅(qū)動(dòng)程序。,10.2.3 Linux對(duì)設(shè)備文件的操作,open() int open(const *pathname, int flag); open函數(shù)用于通過文件路徑打開一個(gè)文件,返回一個(gè)整數(shù)類型的文件描述符。,close() int close(int fd); close函數(shù)用于關(guān)閉文件,close會(huì)讓數(shù)據(jù)寫回磁盤,并釋放文件所占用的資源。,10.2.3 Linux對(duì)設(shè)備文件的操作,read() ssize_t read(int fd, void *buf, size_t count); read函數(shù)從fd指向的文件傳送
6、count個(gè)字節(jié)到buf指針指向的內(nèi)存中文件讀寫指針的位置會(huì)隨著讀取到的字節(jié)移動(dòng)。 當(dāng)讀取成功時(shí),最好將返回值和count值進(jìn)行比較若返回的值比count少,則可能讀到了文件尾,或者read操作被中斷了等。,10.2.4 設(shè)備驅(qū)動(dòng)程序接口,write() ssize_t write(int fd, void *buf, size_t count); write函數(shù)把參數(shù)buf指向的內(nèi)存寫入count個(gè)字節(jié)到fd指向的文件內(nèi)。文件的讀寫位置也會(huì)隨之變化;,10.2.3 Linux對(duì)設(shè)備文件的操作,lseek() loff_t lseek(int fd, loff_t offset, int wh
7、ence); lseek函數(shù)用來控制文件的讀寫位置。,ioctl() int ioctl(int fd, unsigned int cmd,); ioctl是Linux中對(duì)設(shè)備文件操作的特殊函數(shù)??梢詫?duì)應(yīng)到驅(qū)動(dòng)程序的相應(yīng)函數(shù)中。,文件操作示例:,#include #include #include #include int main() int fd,size; char s =”File Operationn”; char buffer80; fd = open(“/tmp/tempfile”,O_WRONLY|O_CREAT); write(fd,s,sizeof(s); close(fd
8、); fd = open(“/tmp/tempfile”,O_RDONLY); size = read(fd,buffer,sizeof(buffer); close(fd); printf(“Display:%s”,buffer); return 0; ,以上的程序首先打開文件,接下來向文件中寫入內(nèi)容,然后從文件中讀取內(nèi)容,最后關(guān)閉文件。其運(yùn)行結(jié)果為: Display: File operation,10.2.4 Linux對(duì)設(shè)備文件的操作,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。所有對(duì)設(shè)備的操作都必須由被控設(shè)備相關(guān)的代碼驅(qū)動(dòng)程序來完成。設(shè)備驅(qū)動(dòng)隱藏了設(shè)備的具體細(xì)節(jié),為不同設(shè)備提供了
9、統(tǒng)一的訪問接口。,應(yīng)用程序與驅(qū)動(dòng)程序之間的調(diào)用關(guān)系,10.2.4 Linux對(duì)設(shè)備文件的操作,Linux應(yīng)用程序中,通過對(duì)文件操作的函數(shù)對(duì)驅(qū)動(dòng)程序的設(shè)備文件進(jìn)行調(diào)用。,10.2.4 Linux對(duì)設(shè)備文件的操作,struct file_operations /文件操作 struct module *owner; loff_t(*llseek)(struct file*, loff_t,int); ssize_t(*read)(struct file*, char*, size_t, loff_t*); ssize_t(*write)(struct file*, const char*, size
10、_t, loff_t*); int(*readdir)(struct file*, void*, filldir_t); unsigned int (*poll)(struct file*, struct poll_table_struct*); int(*ioctl)(struct inode*, struct file*, unsigned int, long); int(*mmap)(struct file*, struct vm_area_struct*); int(*open)(struct inode*, struct file*); int (*release)(struct i
11、node*, struct file*); ,字符設(shè)備操作,10.2.4 Linux對(duì)設(shè)備文件的操作,struct block_device_operations /塊設(shè)備操作 int(*open)(struct inode*, struct file*); int (*release)(struct inode*, struct file*); int(*ioctl)(struct inode*, struct file*, unsigned int, long); int(*check_media_change)(kdev_t); int(*revalidate_disk)(kdev_t
12、); struct module *owner; ,Linux2.4定義的塊設(shè)備操作,10.2.4 Linux對(duì)設(shè)備文件的操作,struct block_device_operations int(*open)(struct inode*, struct file*); int (*release)(struct inode*, struct file*); int(*ioctl)(struct inode*, struct file*, unsigned int, long); int(*compat_ioctl)(struct file*, unsigned int, long); int
13、(*media_changed)(struct gendisk*); int(*revalidate_disk)(struct gendisk*); struct module *owner; ,Linux2.6定義的塊設(shè)備操作,10.2.5 內(nèi)核空間和用戶空間交互,int access_ok(int type, unsigned long addr, unsigned long size); unsigned long copy_to_user(void* to, const void* from, unsigned long fen); unsigned long copy_from_us
14、er(void* to, const void* from, unsigned long fen); void *mmap(void* start, size_t length, int prot, int flags, int fd, loff_t offsize);,直接編譯到內(nèi)核,再運(yùn)行新的內(nèi)核來調(diào)試 調(diào)試效率低,10.2.6 Linux驅(qū)動(dòng)開發(fā)和調(diào)試方法,module模式,將單獨(dú)的驅(qū)動(dòng)編譯為module模式,單獨(dú)加載調(diào)試 調(diào)試效率高,調(diào)試時(shí)不用重啟內(nèi)核,10.2.7 內(nèi)核模塊module,1. 什么是module? module就是一個(gè)程序,但他可以被動(dòng)態(tài)加載到kernel里,成為ke
15、rnel的一部分。加載到kernel里的module具有和kernel一樣的權(quán)力,它可以訪問kernel里發(fā)布的任何數(shù)據(jù)結(jié)構(gòu),使用發(fā)布的function()。,10.2.7 內(nèi)核模塊module,2. kernel如何管理module?,10.2.7 內(nèi)核模塊module,3. module的初始化與回收,int init_module(void) /模塊初始化函數(shù) int result; result = register_chrdev(“參數(shù)1”,“參數(shù)2”,“參數(shù)3”); if(result0) printk(DEVICE_NAME “cant get major mumber”); r
16、eturn result; if(device_major = 0) device_major = result; return result; ,10.2.7 內(nèi)核模塊module,3. module的初始化與回收,void cleanup_module(void) /模塊卸載函數(shù) unregister_chrdev(參數(shù)1,參數(shù)2); ,Module_init(module _init),module_exit(module _cleanup) 這兩個(gè)宏是在Linux內(nèi)核頭文件中定義的,Linux2.4中才具有。,10.3 設(shè)備驅(qū)動(dòng)程序框架,include include include
17、include include define DEMO_DEVICE_MAJOR 125 define DEMO_DEVICE_NAME “demo” define DEMO_DEVICE_COMMAND1 1 define DEMO_DEVICE_COMMAND2 2 define DEMO_DEVICE_COMMAND3 3,1 頭文件包含: 編寫設(shè)備驅(qū)動(dòng)的時(shí)候要包含內(nèi)核的頭文件,2 定義常量: 定義模塊的主設(shè)備號(hào)和模塊的名稱,10.3 設(shè)備驅(qū)動(dòng)程序框架,module_init(demo_init); module_exit(demo_cleanup); static struct fil
18、e_operation demo_device_fops = owner: THIS_MOUDLE, read:demo_read, write:demo_write, ioctl:demo_ioctl, open:demo_open, release:demo_close, ;,3 函數(shù)聲明;,4 文件操作結(jié)構(gòu)的指針,10.3 設(shè)備驅(qū)動(dòng)程序框架,static int demo_init(void) int result; SET_MODULE_OWNER(,10.3 設(shè)備驅(qū)動(dòng)程序框架,static int demo_write(struct file *flip, const char *buffer, size_t count) char dev_buf; copy_from_user(dev_buff, buffer, count); ; static int demo_read(struct file *flip, char *buffer, size_t count, loff_t *ppos) char dev_buf; copy_to_user(buffer, dev_buff, count); ;,5 各種操作,10.3 設(shè)備驅(qū)動(dòng)程序框架,static int demo_ioctl(struct inode *i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院醫(yī)??颇甓裙ぷ骺偨Y(jié)
- 退役軍人服務(wù)保障體系標(biāo)準(zhǔn)化建設(shè)
- 求職者面試技巧全套教程
- 一般工貿(mào)行業(yè)新員工三級(jí)安全培訓(xùn)考試試題及答案
- 建設(shè)工程施工合同糾紛要素式起訴狀模板修改無(wú)約束
- 不用熬夜寫!建設(shè)工程施工合同糾紛要素式起訴狀模板現(xiàn)成用
- 保險(xiǎn)講師培訓(xùn)
- 環(huán)境友好催化技術(shù)課件
- 調(diào)色年終總結(jié)和配料(3篇)
- 公務(wù)員法執(zhí)行情況自查報(bào)告
- 2026年游戲AB測(cè)試實(shí)施方法含答案
- 2025湖南湘西鶴盛原煙發(fā)展有限責(zé)任公司招聘擬錄用人員筆試歷年備考題庫(kù)附帶答案詳解
- 江蘇省2025年普通高中學(xué)業(yè)水平合格性考試英語(yǔ)試卷(含答案)
- 枕骨骨折的護(hù)理課件
- TCEC電力行業(yè)數(shù)據(jù)分類分級(jí)規(guī)范-2024
- 駱駝的養(yǎng)殖技術(shù)與常見病防治
- GB/T 26951-2025焊縫無(wú)損檢測(cè)磁粉檢測(cè)
- 2025及未來5-10年高壓管匯項(xiàng)目投資價(jià)值市場(chǎng)數(shù)據(jù)分析報(bào)告
- 腹部手術(shù)圍手術(shù)期疼痛管理指南(2025版)課件
- 2025年衛(wèi)生人才評(píng)價(jià)考試(臨床醫(yī)學(xué)工程技術(shù)中級(jí))歷年參考題庫(kù)含答案
- 呼吸康復(fù)科普脫口秀
評(píng)論
0/150
提交評(píng)論