




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)嵌入式系統(tǒng)(xtng)(xtng)第十章第十章 嵌入式嵌入式Linux Linux 設(shè)備驅(qū)動設(shè)備驅(qū)動程序程序1第一頁,共27頁。第十章 Agendao10.1 Linux的設(shè)備(shbi)介紹o10.2 Linux設(shè)備(shbi)驅(qū)動程序介紹o10.3 Linux的設(shè)備(shbi)驅(qū)動程序的模塊結(jié)構(gòu)o10.4 Linux的設(shè)備(shbi)驅(qū)動程序的編寫舉例2第二頁,共27頁。10.1 Linux的設(shè)備(shbi)介紹o10.1.1 Linux的設(shè)備(shbi)分類o10.1.2 設(shè)備(shbi)文件o10.1.3 設(shè)備(shbi)號3第三頁,共27頁。10.1.1 Linux的設(shè)備(
2、shbi)分類oLinux支持三類硬件設(shè)備:o字符設(shè)備:指那些無須緩沖直接讀寫的設(shè)備 o塊設(shè)備:只能以塊為單位進行讀寫,典型的塊大小(dxio)為512或1024字節(jié)。 o網(wǎng)絡(luò)設(shè)備 :可以通過BSD套接口訪問 4第四頁,共27頁。10.1.2 設(shè)備(shbi)文件oLinux抽象了對硬件的處理,所有的硬件設(shè)備都可以作為普通文件來看待;它們可以使用和操作系統(tǒng)相同的、標準的系統(tǒng)調(diào)用接口來打開、關(guān)閉、讀寫和控制I/O的操作,而驅(qū)動程序的主要任務(wù)也就是要實現(xiàn)(shxin)這些系統(tǒng)調(diào)用函數(shù)。 5第五頁,共27頁。設(shè)備(shbi)文件oLinux系統(tǒng)中的所有硬件設(shè)備都使用一個特殊的設(shè)備文件來表示o例如,系
3、統(tǒng)中的第一個IDE硬盤用/dev/had來表示。 串口可以(ky)用/dev/stty0來表示.o由于引入了設(shè)備文件這一概念,Linux為文件和設(shè)備提供了一致的用戶接口。對用戶來說,設(shè)備文件與普通文件并無區(qū)別。6第六頁,共27頁。10.1.3 設(shè)備(shbi)號o每個設(shè)備文件都對應(yīng)有兩個設(shè)備號:o一個是主設(shè)備號,表示該設(shè)備的種類,也標識了該設(shè)備所使用的驅(qū)動程序;o另一個是次設(shè)備號,標識使用同一設(shè)備驅(qū)動程序的不同硬件設(shè)備。o使用mknod命令可以創(chuàng)建指定類型的設(shè)備文件,同時(tngsh)為其分配相應(yīng)的主設(shè)備號和次設(shè)備號。 orootxsbase root# mknod /dev/lp0 c 6
4、0 7第七頁,共27頁。第十章 Agendao10.1 Linux的設(shè)備介紹(jisho)o10.2 Linux設(shè)備驅(qū)動程序介紹(jisho)o10.3 Linux的設(shè)備驅(qū)動程序的模塊結(jié)構(gòu)o10.4 Linux的設(shè)備驅(qū)動程序的編寫舉例8第八頁,共27頁。10.2 Linux設(shè)備(shbi)驅(qū)動程序介紹o10.2.1 設(shè)備驅(qū)動(q dn)的層次o10.2.2 設(shè)備驅(qū)動(q dn)程序與外界的接口9第九頁,共27頁。設(shè)備(shbi)驅(qū)動程序o設(shè)備驅(qū)動程序是操作系統(tǒng)內(nèi)核和機器(j q)硬件之間的接口。設(shè)備驅(qū)動程序為應(yīng)用程序屏蔽了硬件的細節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件, 應(yīng)用程序可以
5、象操作普通文件一樣對硬件設(shè)備進行操作。o設(shè)備驅(qū)動程序主要完成以下功能:o對設(shè)備初始化和釋放。o把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。o讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請求的數(shù)據(jù)。o檢測和處理設(shè)備出現(xiàn)的錯誤。 10第十頁,共27頁。10.2.1 設(shè)備驅(qū)動(q dn)的層次oLinux下的設(shè)備驅(qū)動程序是內(nèi)核的一部分,運行在內(nèi)核模式,也就是說設(shè)備驅(qū)動程序為內(nèi)核提供了一個I/O接口,用戶使用這個接口實現(xiàn)對設(shè)備的操作。oLinux的設(shè)備驅(qū)動程序介于(設(shè)備)文件系統(tǒng)與物理設(shè)備中間。用戶通過(tnggu)應(yīng)用程序進程輸入輸入請求,進而調(diào)用(設(shè)備)文件系統(tǒng),(設(shè)備)文件系統(tǒng)通過(tnggu)設(shè)
6、備驅(qū)動程序控制物理設(shè)備進行設(shè)備的操作,如進行磁盤文件的讀出和寫入操作等等,如圖所示。oLinux設(shè)備驅(qū)動程序包含了中斷處理程序和設(shè)備服務(wù)子程序。11第十一頁,共27頁。設(shè)備驅(qū)動(q dn)的層次12第十二頁,共27頁。10.2.2 設(shè)備(shbi)驅(qū)動程序與外界的接口o打開的設(shè)備在內(nèi)核內(nèi)部由file結(jié)構(gòu)標識,內(nèi)核使用file_operations結(jié)構(gòu)訪問驅(qū)動程序的函數(shù)。ofile_operations結(jié)構(gòu)是一個定義在中的函數(shù)指針數(shù)組,這就是通常所說的設(shè)備驅(qū)動程序與外界的接口。o每個文件都與它自己(zj)的函數(shù)集相關(guān)聯(lián)(通過包括指向file_operations結(jié)構(gòu)的一個名為f_op的指針字段)
7、。這些操作主要負責系統(tǒng)調(diào)用的實現(xiàn),并因此被命名為open、read 等。13第十三頁,共27頁。file_operations ostruct file_operations ostruct module *owner;oloff_t (*llseek) (struct file *, loff_t, int);ossize_t (*read) (struct file *, char *, size_t, loff_t *);ossize_t (*write) (struct file *, const char *, size_t, loff_t *);oint (*readdir) (s
8、truct file *, void *, filldir_t);ounsigned int (*poll) (struct file *, struct poll_table_struct *);oint (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);oint (*mmap) (struct file *, struct vm_area_struct *);oint (*open) (struct inode *, struct file *);oint (*flush) (struct file
9、*);oint (*release) (struct inode *, struct file *);oint (*fsync) (struct file *, struct dentry *, int datasync);oint (*fasync) (int, struct file *, int);oint (*lock) (struct file *, int, struct file_lock *);ossize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);ossize_t (*w
10、ritev) (struct file *, const struct iovec *, unsigned long, loff_t *);ossize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);ounsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);o#ifdef MAGIC_ROM_PTRoint (*romptr) (st
11、ruct file *, struct vm_area_struct *);o#endif /* MAGIC_ROM_PTR */o; 14第十四頁,共27頁。Ownermodule的擁有者。Llseek重新定位讀寫位置。Read從設(shè)備中讀取數(shù)據(jù)。Write向字符設(shè)備中寫入數(shù)據(jù)。Readdir只用于文件系統(tǒng),對設(shè)備無用。Ioctl控制設(shè)備,除讀寫操作外的其他控制命令。Mmap將設(shè)備內(nèi)存映射到進程地址空間,通常只用于塊設(shè)備。Open打開設(shè)備并初始化設(shè)備。Flush清除內(nèi)容,一般只用于網(wǎng)絡(luò)文件系統(tǒng)中。Release關(guān)閉設(shè)備并釋放資源。Fsync實現(xiàn)內(nèi)存與設(shè)備的同步,如將內(nèi)存數(shù)據(jù)寫入硬盤。Fasyn
12、c實現(xiàn)內(nèi)存與設(shè)備之間的異步通訊。Lock文件鎖定,用于文件共享時的互斥訪問。Readv在進行讀操作前要驗證地址是否可讀。Writev在進行寫操作前要驗證地址是否可寫。15第十五頁,共27頁。第十章 Agendao10.1 Linux的設(shè)備介紹o10.2 Linux設(shè)備驅(qū)動程序介紹o10.3 Linux的設(shè)備驅(qū)動程序的模塊結(jié)構(gòu)o10.4 Linux的設(shè)備驅(qū)動程序的編寫(binxi)舉例16第十六頁,共27頁。10.3 Linux的設(shè)備驅(qū)動程序的模塊(m kui)結(jié)構(gòu)oLinux中的可加載模塊(loadable module)是Linux內(nèi)核支持的動態(tài)可加載模塊(dynamic loadable
13、module),它們是內(nèi)核的一部分,但是并沒有編譯到內(nèi)核里面去。o模塊可以單獨編譯成目標(mbio)代碼,以.o的目標(mbio)文件形式存在。它可以根據(jù)需要在系統(tǒng)啟動后動態(tài)加載到系統(tǒng)內(nèi)核之中。當模塊不再被需要時,可以動態(tài)地寫在出系統(tǒng)內(nèi)核。oLinux中地大多數(shù)設(shè)備驅(qū)動程序都以模塊地形式存在。 17第十七頁,共27頁。模塊(m kui)o模塊的裝載和卸載有兩種方式:o可以通過超級用戶運行insmod和rmmod命令顯式地將模塊載入內(nèi)核(ni h)或從內(nèi)核(ni h)中卸載;o內(nèi)核(ni h)自身也可以在需要時,請求守護進程(kerneld)裝載和卸載模塊。o模塊方式對性能的影響:o采用了一些額
14、外的代碼和數(shù)據(jù)結(jié)構(gòu),它們占用了一部分內(nèi)存。o用戶進程通過模塊對內(nèi)核(ni h)資源進行的訪問是間接的,不可避免地降低了內(nèi)核(ni h)資源地訪問效率。 18第十八頁,共27頁。常用命令olsmod : 列出當前系統(tǒng)中加載的模塊。oinsmod, modprobe :用于加載當前模塊,但insmod不會自動解決依存關(guān)系,而modprobe則可以根據(jù)模塊間依存關(guān)系以及/etc/modules/conf文件中的內(nèi)容自動插入模塊。ormmod :把某個不再使用的模塊從內(nèi)核中卸載。odepmod :制造模塊相關(guān)文件(module dependency file),以便(ybin)后面要使用insmod命
15、令用來查詢模塊的具體位置 19第十九頁,共27頁。第十章 Agendao10.1 Linux的設(shè)備介紹o10.2 Linux設(shè)備驅(qū)動程序介紹o10.3 Linux的設(shè)備驅(qū)動程序的模塊(m kui)結(jié)構(gòu)o10.4 Linux的設(shè)備驅(qū)動程序的編寫舉例20第二十頁,共27頁。字符(z f)設(shè)備驅(qū)動程序o一個最簡單的字符設(shè)備驅(qū)動程序o該字符設(shè)備具備4個基本操作bytedevice_open(),bytedevice_write(),bytedevice_read(),bytedevice_release()o實現(xiàn)的基本功能為向這個(zh ge)新建的字符設(shè)備先寫入一些數(shù)據(jù),然后再從這個(zh ge)設(shè)
16、備中讀取這些數(shù)據(jù)。 21第二十一頁,共27頁。1 主要(zhyo)數(shù)據(jù)結(jié)構(gòu)和全局變量 ofile_operations oStructobytedevice.c 22第二十二頁,共27頁。2 主要(zhyo)接口函數(shù) obytedevice_open,bytedevice_release:主要是對設(shè)備進行初始化和釋放,實現(xiàn)了設(shè)備的打開和關(guān)閉功能。 obytedevice_read:當設(shè)備文件(wnjin)執(zhí)行該函數(shù)調(diào)用時,表面上看像時從設(shè)備中讀取數(shù)據(jù),實際上是從內(nèi)核空間的數(shù)據(jù)隊列中讀取,通過copy_to_user()函數(shù),把數(shù)據(jù)從內(nèi)核空間傳送到用戶空間,使得用戶空間的其他代碼(測試代碼)可以
17、訪問這些數(shù)據(jù)。 obytedevice_write:和bytedevice_read()函數(shù)相似,只不過數(shù)據(jù)傳送的方向發(fā)生了變化,即把參數(shù)中的count字節(jié)數(shù)從用戶空間的緩沖區(qū)buf復(fù)制到硬件或者內(nèi)核的緩沖區(qū)中。 23第二十三頁,共27頁。3 模塊(m kui)加載 o采取模塊加載的方式 :init_module和cleanup_module函數(shù)o主要使用(shyng)了驅(qū)動程序的注冊與注銷中的register_chrdev()和unregister_chrdev()。 24第二十四頁,共27頁。4 驅(qū)動(q dn)安裝過程 o完成上面的工作后,對前面的代碼進行編譯,并通過insmod的方式加載其到內(nèi)核中。o比如bytedevice源代碼放在/usr/src/bytedevice下,可以這樣編譯,生成bytedevice.o文件:o$ gcc bytedevice.c I /usr/src/bytedevice/include c bytedevice.c D_KERNEL_ DMODULEo接下來把目標文件加載到內(nèi)核。可以
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 義齒注冊檢驗合同范例
- 出租房交物業(yè)費合同范例
- 砂礫排水墊層施工方案
- 人工安全合同范例
- 出售養(yǎng)殖棚合同范例
- 仿真綠植布置合同范例
- 考慮水平隔板的單箱雙室波形鋼腹板組合箱梁的剪力滯效應(yīng)研究
- 信訪信息咨詢合同范例
- PEDOT-PSS基二元、三元熱電復(fù)合材料的制備與性能測試
- 基于粒子群算法的低碳冷鏈物流配送路徑優(yōu)化
- 2024年江西省公務(wù)員考試《行測》真題及答案解析
- 醫(yī)學裝備管理工作總結(jié)
- 2024-2025學年湖南省雅禮集團高二(上)第一次月考數(shù)學試卷(含答案)
- 現(xiàn)代家政導(dǎo)論-課件 4.1.3認識我國家政教育發(fā)展
- 《互聯(lián)網(wǎng)應(yīng)用新特征》課件 2024-2025學年人教版(2024)初中信息科技七年級全一冊
- 2024年部編版六年級語文上冊第六單元 語文園地六(教案)
- 環(huán)磷酰胺的護理
- 中考英語688高頻詞大綱詞頻表
- 計算機基礎(chǔ)教程電子版
- 關(guān)于如何做好清單招標控制價的幾點建議
- HGT 6342-2024《工業(yè)用甲基四氫苯酐》
評論
0/150
提交評論