




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式系統(tǒng)第十章嵌入式Linux設(shè)備驅(qū)動(dòng)程序1嵌入式系統(tǒng)1第十章Agenda10.1Linux的設(shè)備介紹10.2Linux設(shè)備驅(qū)動(dòng)程序介紹10.3Linux的設(shè)備驅(qū)動(dòng)程序的模塊結(jié)構(gòu)10.4Linux的設(shè)備驅(qū)動(dòng)程序的編寫舉例2第十章Agenda210.1Linux的設(shè)備介紹10.1.1Linux的設(shè)備分類10.1.2設(shè)備文件10.1.3設(shè)備號 310.1Linux的設(shè)備介紹10.1.1Linux的10.1.1Linux的設(shè)備分類Linux支持三類硬件設(shè)備:字符設(shè)備:指那些無須緩沖直接讀寫的設(shè)備塊設(shè)備:只能以塊為單位進(jìn)行讀寫,典型的塊大小為512或1024字節(jié)。網(wǎng)絡(luò)設(shè)備:可以通過BSD套接口訪問410.1.1Linux的設(shè)備分類Linux支持三類硬件設(shè)備10.1.2設(shè)備文件Linux抽象了對硬件的處理,所有的硬件設(shè)備都可以作為普通文件來看待;它們可以使用和操作系統(tǒng)相同的、標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口來打開、關(guān)閉、讀寫和控制I/O的操作,而驅(qū)動(dòng)程序的主要任務(wù)也就是要實(shí)現(xiàn)這些系統(tǒng)調(diào)用函數(shù)。
510.1.2設(shè)備文件Linux抽象了對硬件的處理,所有的硬設(shè)備文件Linux系統(tǒng)中的所有硬件設(shè)備都使用一個(gè)特殊的設(shè)備文件來表示例如,系統(tǒng)中的第一個(gè)IDE硬盤用/dev/had來表示。串口可以用/dev/stty0來表示.由于引入了設(shè)備文件這一概念,Linux為文件和設(shè)備提供了一致的用戶接口。對用戶來說,設(shè)備文件與普通文件并無區(qū)別。6設(shè)備文件Linux系統(tǒng)中的所有硬件設(shè)備都使用一個(gè)特殊的設(shè)備文10.1.3設(shè)備號每個(gè)設(shè)備文件都對應(yīng)有兩個(gè)設(shè)備號:一個(gè)是主設(shè)備號,表示該設(shè)備的種類,也標(biāo)識了該設(shè)備所使用的驅(qū)動(dòng)程序;另一個(gè)是次設(shè)備號,標(biāo)識使用同一設(shè)備驅(qū)動(dòng)程序的不同硬件設(shè)備。使用mknod命令可以創(chuàng)建指定類型的設(shè)備文件,同時(shí)為其分配相應(yīng)的主設(shè)備號和次設(shè)備號。
[root@xsbaseroot]#mknod/dev/lp0c60
710.1.3設(shè)備號每個(gè)設(shè)備文件都對應(yīng)有兩個(gè)設(shè)備號:7第十章Agenda10.1Linux的設(shè)備介紹10.2Linux設(shè)備驅(qū)動(dòng)程序介紹10.3Linux的設(shè)備驅(qū)動(dòng)程序的模塊結(jié)構(gòu)10.4Linux的設(shè)備驅(qū)動(dòng)程序的編寫舉例8第十章Agenda810.2Linux設(shè)備驅(qū)動(dòng)程序介紹10.2.1設(shè)備驅(qū)動(dòng)的層次10.2.2設(shè)備驅(qū)動(dòng)程序與外界的接口 910.2Linux設(shè)備驅(qū)動(dòng)程序介紹10.2.1設(shè)備驅(qū)動(dòng)設(shè)備驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序主要完成以下功能:對設(shè)備初始化和釋放。把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請求的數(shù)據(jù)。檢測和處理設(shè)備出現(xiàn)的錯(cuò)誤。10設(shè)備驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。10.2.1設(shè)備驅(qū)動(dòng)的層次Linux下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,運(yùn)行在內(nèi)核模式,也就是說設(shè)備驅(qū)動(dòng)程序?yàn)閮?nèi)核提供了一個(gè)I/O接口,用戶使用這個(gè)接口實(shí)現(xiàn)對設(shè)備的操作。Linux的設(shè)備驅(qū)動(dòng)程序介于(設(shè)備)文件系統(tǒng)與物理設(shè)備中間。用戶通過應(yīng)用程序進(jìn)程輸入輸入請求,進(jìn)而調(diào)用(設(shè)備)文件系統(tǒng),(設(shè)備)文件系統(tǒng)通過設(shè)備驅(qū)動(dòng)程序控制物理設(shè)備進(jìn)行設(shè)備的操作,如進(jìn)行磁盤文件的讀出和寫入操作等等,如圖所示。Linux設(shè)備驅(qū)動(dòng)程序包含了中斷處理程序和設(shè)備服務(wù)子程序。1110.2.1設(shè)備驅(qū)動(dòng)的層次Linux下的設(shè)備驅(qū)動(dòng)程序是內(nèi)核設(shè)備驅(qū)動(dòng)的層次12設(shè)備驅(qū)動(dòng)的層次1210.2.2設(shè)備驅(qū)動(dòng)程序與外界的接口打開的設(shè)備在內(nèi)核內(nèi)部由file結(jié)構(gòu)標(biāo)識,內(nèi)核使用file_operations結(jié)構(gòu)訪問驅(qū)動(dòng)程序的函數(shù)。file_operations結(jié)構(gòu)是一個(gè)定義在<linux/fs.h>中的函數(shù)指針數(shù)組,這就是通常所說的設(shè)備驅(qū)動(dòng)程序與外界的接口。每個(gè)文件都與它自己的函數(shù)集相關(guān)聯(lián)(通過包括指向file_operations結(jié)構(gòu)的一個(gè)名為f_op的指針字段)。這些操作主要負(fù)責(zé)系統(tǒng)調(diào)用的實(shí)現(xiàn),并因此被命名為open、read等。1310.2.2設(shè)備驅(qū)動(dòng)程序與外界的接口打開的設(shè)備在內(nèi)核內(nèi)部由file_operationsstructfile_operations{ structmodule*owner; loff_t(*llseek)(structfile*,loff_t,int); ssize_t(*read)(structfile*,char*,size_t,loff_t*); ssize_t(*write)(structfile*,constchar*,size_t,loff_t*); int(*readdir)(structfile*,void*,filldir_t); unsignedint(*poll)(structfile*,structpoll_table_struct*); int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong); int(*mmap)(structfile*,structvm_area_struct*); int(*open)(structinode*,structfile*); int(*flush)(structfile*); int(*release)(structinode*,structfile*); int(*fsync)(structfile*,structdentry*,intdatasync); int(*fasync)(int,structfile*,int); int(*lock)(structfile*,int,structfile_lock*); ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*); ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*); ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);#ifdefMAGIC_ROM_PTR int(*romptr)(structfile*,structvm_area_struct*);#endif/*MAGIC_ROM_PTR*/};
14file_operationsstructfile_opOwnermodule的擁有者。Llseek重新定位讀寫位置。Read從設(shè)備中讀取數(shù)據(jù)。Write向字符設(shè)備中寫入數(shù)據(jù)。Readdir只用于文件系統(tǒng),對設(shè)備無用。Ioctl控制設(shè)備,除讀寫操作外的其他控制命令。Mmap將設(shè)備內(nèi)存映射到進(jìn)程地址空間,通常只用于塊設(shè)備。Open打開設(shè)備并初始化設(shè)備。Flush清除內(nèi)容,一般只用于網(wǎng)絡(luò)文件系統(tǒng)中。Release關(guān)閉設(shè)備并釋放資源。Fsync實(shí)現(xiàn)內(nèi)存與設(shè)備的同步,如將內(nèi)存數(shù)據(jù)寫入硬盤。Fasync實(shí)現(xiàn)內(nèi)存與設(shè)備之間的異步通訊。Lock文件鎖定,用于文件共享時(shí)的互斥訪問。Readv在進(jìn)行讀操作前要驗(yàn)證地址是否可讀。Writev在進(jìn)行寫操作前要驗(yàn)證地址是否可寫。15Ownermodule的擁有者。Llseek重新定位讀寫位置第十章Agenda10.1Linux的設(shè)備介紹10.2Linux設(shè)備驅(qū)動(dòng)程序介紹10.3Linux的設(shè)備驅(qū)動(dòng)程序的模塊結(jié)構(gòu)10.4Linux的設(shè)備驅(qū)動(dòng)程序的編寫舉例16第十章Agenda1610.3Linux的設(shè)備驅(qū)動(dòng)程序的模塊結(jié)構(gòu)Linux中的可加載模塊(loadablemodule)是Linux內(nèi)核支持的動(dòng)態(tài)可加載模塊(dynamicloadablemodule),它們是內(nèi)核的一部分,但是并沒有編譯到內(nèi)核里面去。模塊可以單獨(dú)編譯成目標(biāo)代碼,以.o的目標(biāo)文件形式存在。它可以根據(jù)需要在系統(tǒng)啟動(dòng)后動(dòng)態(tài)加載到系統(tǒng)內(nèi)核之中。當(dāng)模塊不再被需要時(shí),可以動(dòng)態(tài)地寫在出系統(tǒng)內(nèi)核。Linux中地大多數(shù)設(shè)備驅(qū)動(dòng)程序都以模塊地形式存在。1710.3Linux的設(shè)備驅(qū)動(dòng)程序的模塊結(jié)構(gòu)Linux中的模塊模塊的裝載和卸載有兩種方式:可以通過超級用戶運(yùn)行insmod和rmmod命令顯式地將模塊載入內(nèi)核或從內(nèi)核中卸載;內(nèi)核自身也可以在需要時(shí),請求守護(hù)進(jìn)程(kerneld)裝載和卸載模塊。模塊方式對性能的影響:采用了一些額外的代碼和數(shù)據(jù)結(jié)構(gòu),它們占用了一部分內(nèi)存。用戶進(jìn)程通過模塊對內(nèi)核資源進(jìn)行的訪問是間接的,不可避免地降低了內(nèi)核資源地訪問效率。18模塊模塊的裝載和卸載有兩種方式:18常用命令lsmod:列出當(dāng)前系統(tǒng)中加載的模塊。insmod,modprobe:用于加載當(dāng)前模塊,但insmod不會(huì)自動(dòng)解決依存關(guān)系,而modprobe則可以根據(jù)模塊間依存關(guān)系以及/etc/modules/conf文件中的內(nèi)容自動(dòng)插入模塊。rmmod:把某個(gè)不再使用的模塊從內(nèi)核中卸載。depmod:制造模塊相關(guān)文件(moduledependencyfile),以便后面要使用insmod命令用來查詢模塊的具體位置19常用命令lsmod:列出當(dāng)前系統(tǒng)中加載的模塊。19第十章Agenda10.1Linux的設(shè)備介紹10.2Linux設(shè)備驅(qū)動(dòng)程序介紹10.3Linux的設(shè)備驅(qū)動(dòng)程序的模塊結(jié)構(gòu)10.4Linux的設(shè)備驅(qū)動(dòng)程序的編寫舉例20第十章Agenda20字符設(shè)備驅(qū)動(dòng)程序一個(gè)最簡單的字符設(shè)備驅(qū)動(dòng)程序該字符設(shè)備具備4個(gè)基本操作bytedevice_open(),bytedevice_write(),bytedevice_read(),bytedevice_release()實(shí)現(xiàn)的基本功能為向這個(gè)新建的字符設(shè)備先寫入一些數(shù)據(jù),然后再從這個(gè)設(shè)備中讀取這些數(shù)據(jù)。21字符設(shè)備驅(qū)動(dòng)程序一個(gè)最簡單的字符設(shè)備驅(qū)動(dòng)程序211主要數(shù)據(jù)結(jié)構(gòu)和全局變量file_operations{}Structbytedevice.c221主要數(shù)據(jù)結(jié)構(gòu)和全局變量file_operations{2主要接口函數(shù)bytedevice_open,bytedevice_release:主要是對設(shè)備進(jìn)行初始化和釋放,實(shí)現(xiàn)了設(shè)備的打開和關(guān)閉功能。bytedevice_read:當(dāng)設(shè)備文件執(zhí)行該函數(shù)調(diào)用時(shí),表面上看像時(shí)從設(shè)備中讀取數(shù)據(jù),實(shí)際上是從內(nèi)核空間的數(shù)據(jù)隊(duì)列中讀取,通過copy_to_user()函數(shù),把數(shù)據(jù)從內(nèi)核空間傳送到用戶空間,使得用戶空間的其他代碼(測試代碼)可以訪問這些數(shù)據(jù)。bytedevice_write:和bytedevice_read()函數(shù)相似,只不過數(shù)據(jù)傳送的方向發(fā)生了變化,即把參數(shù)中的count字節(jié)數(shù)從用戶空間的緩沖區(qū)buf復(fù)制到硬件或者內(nèi)核的緩沖區(qū)中。232主要接口函數(shù)bytedevice_open,byted3模塊加載采取模塊加載的方式:init_module和cleanup_module函數(shù)主要使用了驅(qū)動(dòng)程序的注冊與注銷中的register_chrdev()和unregister_chrdev()。243模塊加載采取模塊加載的方式:init_module和4驅(qū)動(dòng)安裝過程完成上面的工作后,對前面的代碼進(jìn)行編譯,并通過insmod的方式加載其到內(nèi)核中。比如bytedevice源代碼放在/usr/src/bytedevice下,可以這樣編譯,生成bytedevice.o文件:$gccbytedevice.c–I/usr/src/bytedevice/include–cbytedevice.c–D__KERNEL__-DMODULE接下來把目標(biāo)文件加載到內(nèi)核??梢允褂妹睿?insmod–fbytedevic
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保行動(dòng)指南
- 古文明的奧秘揭示
- 商業(yè)用電改成民用申請書
- 營養(yǎng)配餐員筆試題練習(xí)測試題附答案
- 進(jìn)一步財(cái)會(huì)監(jiān)督復(fù)習(xí)試題附答案
- 雙方客棧轉(zhuǎn)讓合同范例
- 作品維修合同范本
- 品質(zhì)童裝供貨合同范本
- 合同范本模板前付清
- 加項(xiàng)合同范本
- 科目一知識大全課件
- 2016-2023年大慶醫(yī)學(xué)高等??茖W(xué)校高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 泛微協(xié)同OA與SAP集成應(yīng)用解決方案V講訴
- 探討電磁感應(yīng)現(xiàn)象對電能轉(zhuǎn)化效率的影響
- EHS法律法規(guī)清單及合規(guī)性評估
- 橋梁定期檢查-主要部件檢查要點(diǎn)與評定標(biāo)準(zhǔn)
- 長途汽車客運(yùn)站調(diào)研報(bào)告
- 陜西各市(精確到縣區(qū))地圖PPT課件(可編輯版)
- JTG C10-2007 公路勘測規(guī)范正式版
- (完整版)國際金融法
- 近代德國的學(xué)前教育課件
評論
0/150
提交評論