




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、嵌入式嵌入式Linux操作系統(tǒng)操作系統(tǒng)第第3章章 基于基于Linux的嵌入式軟件開發(fā)的嵌入式軟件開發(fā) 嵌入式軟件結(jié)構(gòu)嵌入式軟件結(jié)構(gòu)1 1嵌入式軟件開發(fā)流程嵌入式軟件開發(fā)流程2 2嵌入式嵌入式linux開發(fā)環(huán)境開發(fā)環(huán)境3 3嵌入式系統(tǒng)引導代碼嵌入式系統(tǒng)引導代碼4 4第第3章章 基于基于Linux的嵌入式軟件開發(fā)的嵌入式軟件開發(fā)linux內(nèi)核結(jié)構(gòu)及移植內(nèi)核結(jié)構(gòu)及移植5 5嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植6 6linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述7 7設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口8 8linux設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程9 9嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v Linux支持
2、多種文件系統(tǒng),包括支持多種文件系統(tǒng),包括EXT2、EXT3、vFat、NTFS、ISO9660、JFFS、RomFS和和NFS等等v 為了對各類文件系統(tǒng)進行統(tǒng)一管理,為了對各類文件系統(tǒng)進行統(tǒng)一管理,Linux引入了虛擬文引入了虛擬文件系統(tǒng)件系統(tǒng)VFS(Virtual File System),為各類文件系統(tǒng)提供一,為各類文件系統(tǒng)提供一個統(tǒng)一的操作界面和應用編程接口。個統(tǒng)一的操作界面和應用編程接口。嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 基于基于FLASH的文件系統(tǒng)的文件系統(tǒng) 1. JFFS2 2. YAFFS 3. Cramfs 4. Romfs 嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v
3、 JFFS2v JFFS文件系統(tǒng)最早是由瑞典文件系統(tǒng)最早是由瑞典Axis Communications公司基公司基于于Linux2.0的內(nèi)核為嵌入式系統(tǒng)開發(fā)的文件系統(tǒng)。的內(nèi)核為嵌入式系統(tǒng)開發(fā)的文件系統(tǒng)。JFFS2是是RedHat公司基于公司基于JFFS開發(fā)的閃存文件系統(tǒng),最初是針開發(fā)的閃存文件系統(tǒng),最初是針對對RedHat公司嵌入式產(chǎn)品公司嵌入式產(chǎn)品eCos開發(fā)的嵌入式文件系統(tǒng),開發(fā)的嵌入式文件系統(tǒng),所以所以JFFS2也可以用在也可以用在Linux, uCLinux中中v JFFS2主要用于主要用于NOR FLASH,不適合,不適合NAND FLASH嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v
4、 YAFFS/YAFFS2v YAFFS/YAFFS2是專為嵌入式系統(tǒng)使用是專為嵌入式系統(tǒng)使用NAND型閃存而設(shè)型閃存而設(shè)計的一種日志型文件系統(tǒng)。與計的一種日志型文件系統(tǒng)。與JFFS2相比,它減少了一些相比,它減少了一些功能功能(例如不支持數(shù)據(jù)壓縮例如不支持數(shù)據(jù)壓縮),所以速度更快,掛載時間很,所以速度更快,掛載時間很短,對內(nèi)存的占用較小。短,對內(nèi)存的占用較小。v 另外,另外, YAFFS/YAFFS2是跨平臺的文件系統(tǒng),除了是跨平臺的文件系統(tǒng),除了Linux和和eCos,還支持,還支持WinCE, pSOS和和ThreadX等。等。嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v Cramfs v
5、 Cramfs是是Linux的創(chuàng)始人的創(chuàng)始人 Linus Torvalds參與開發(fā)的一種參與開發(fā)的一種只讀的壓縮文件系統(tǒng)。它也基于只讀的壓縮文件系統(tǒng)。它也基于MTD驅(qū)動程序。驅(qū)動程序。v 在在Cramfs文件系統(tǒng)中,每一頁文件系統(tǒng)中,每一頁(4KB)被單獨壓縮,可以隨被單獨壓縮,可以隨機頁訪問,其壓縮比高達機頁訪問,其壓縮比高達2:1,為嵌入式系統(tǒng)節(jié)省大量的為嵌入式系統(tǒng)節(jié)省大量的Flash存儲空間,使系統(tǒng)可通過更低容量的存儲空間,使系統(tǒng)可通過更低容量的FLASH存儲相存儲相同的文件,從而降低系統(tǒng)成本。同的文件,從而降低系統(tǒng)成本。嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v Romfsv 傳統(tǒng)型的
6、傳統(tǒng)型的Romfs文件系統(tǒng)是一種簡單的、緊湊的、只讀的文件系統(tǒng)是一種簡單的、緊湊的、只讀的文件系統(tǒng),不支持動態(tài)擦寫保存,按順序存放數(shù)據(jù),因而文件系統(tǒng),不支持動態(tài)擦寫保存,按順序存放數(shù)據(jù),因而支持應用程序以支持應用程序以XIP(eXecute In Place,芯片內(nèi)執(zhí)行,指應片內(nèi)執(zhí)行,指應用程序可以直接在用程序可以直接在FLAH閃存內(nèi)運行,不必再把代碼讀到閃存內(nèi)運行,不必再把代碼讀到系統(tǒng)系統(tǒng)RAM中中 )方式運行,在系統(tǒng)運行時節(jié)省方式運行,在系統(tǒng)運行時節(jié)省RAM空間??臻g。v uClinux系統(tǒng)通常采用系統(tǒng)通常采用Romfs文件系統(tǒng)文件系統(tǒng)嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 基于基于R
7、AM的文件系統(tǒng)的文件系統(tǒng)v 1. Ramdisk v 2. Ramfs/Tmpfs嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v Ramdiskv Ramdisk是將一部分固定大小的內(nèi)存當作分區(qū)來使用。它是將一部分固定大小的內(nèi)存當作分區(qū)來使用。它并非一個實際的文件系統(tǒng),而是一種將實際的文件系統(tǒng)裝并非一個實際的文件系統(tǒng),而是一種將實際的文件系統(tǒng)裝入內(nèi)存的機制,并且可以作為根文件系統(tǒng)。入內(nèi)存的機制,并且可以作為根文件系統(tǒng)。v 將一些經(jīng)常被訪問而又不會更改的文件將一些經(jīng)常被訪問而又不會更改的文件(如只讀的根文件如只讀的根文件系統(tǒng)系統(tǒng))通過通過Ramdisk放在內(nèi)存中,可以明顯提高系統(tǒng)性能。放在內(nèi)存中,可
8、以明顯提高系統(tǒng)性能。v 在在Linux的啟動階段,的啟動階段,initrd提供了一套機制,可以將內(nèi)核提供了一套機制,可以將內(nèi)核映像和根文件系統(tǒng)一起載入內(nèi)存。映像和根文件系統(tǒng)一起載入內(nèi)存。 嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v Ramfs/Tmpfs v Ramfs/Tmpfs文件系統(tǒng)把所有的文件都放在文件系統(tǒng)把所有的文件都放在RAM中,所中,所以讀以讀/寫操作發(fā)生在寫操作發(fā)生在RAM中,可以用中,可以用Ramfs/Tmpfs來存儲來存儲一些臨時性或經(jīng)常要修改的數(shù)據(jù),例如一些臨時性或經(jīng)常要修改的數(shù)據(jù),例如/tmp和和/var目錄,目錄,這樣既避免了對這樣既避免了對Flash存儲器的讀寫損耗
9、,也提高了數(shù)據(jù)存儲器的讀寫損耗,也提高了數(shù)據(jù)讀寫速度。讀寫速度。v Ramfs/Tmpfs相對傳統(tǒng)的相對傳統(tǒng)的Ramdisk的不同之處主要在于:的不同之處主要在于:不能格式化,文件系統(tǒng)大小可隨所含文件內(nèi)容大小變化。不能格式化,文件系統(tǒng)大小可隨所含文件內(nèi)容大小變化。v Tmpfs的一個缺點是當系統(tǒng)重新引導時會丟失所有數(shù)據(jù)的一個缺點是當系統(tǒng)重新引導時會丟失所有數(shù)據(jù)嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 網(wǎng)絡文件系統(tǒng)網(wǎng)絡文件系統(tǒng)NFSv NFS是由是由Sun開發(fā)并發(fā)展起來的一項在不同機器、不同操開發(fā)并發(fā)展起來的一項在不同機器、不同操作系統(tǒng)之間通過網(wǎng)絡共享文件的技術(shù)。作系統(tǒng)之間通過網(wǎng)絡共享文件的技
10、術(shù)。v 在嵌入式在嵌入式Linux系統(tǒng)的開發(fā)調(diào)試階段,可以利用該技術(shù)在系統(tǒng)的開發(fā)調(diào)試階段,可以利用該技術(shù)在主機上建立基于主機上建立基于NFS的根文件系統(tǒng),掛載到嵌入式設(shè)備,的根文件系統(tǒng),掛載到嵌入式設(shè)備,可以很方便地修改根文件系統(tǒng)的內(nèi)容可以很方便地修改根文件系統(tǒng)的內(nèi)容嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 文件系統(tǒng)格式選擇的基本策略文件系統(tǒng)格式選擇的基本策略v 通常,當設(shè)計根文件系統(tǒng)時,可以按如下幾點配置方案來通常,當設(shè)計根文件系統(tǒng)時,可以按如下幾點配置方案來解決文件系統(tǒng)的選擇:解決文件系統(tǒng)的選擇:v 把任何在運行時不需要進行更新的文件放在把任何在運行時不需要進行更新的文件放在cramFs
11、文件文件系統(tǒng)中。因為系統(tǒng)中。因為CramFs的壓縮比高達的壓縮比高達2:1,節(jié)約存儲空間的效節(jié)約存儲空間的效果是明顯的。如果應用程序要求采用果是明顯的。如果應用程序要求采用XIP方式運行,則可方式運行,則可以選以選 擇采用擇采用RomFs文件系統(tǒng)。文件系統(tǒng)。v 那些需要經(jīng)常讀那些需要經(jīng)常讀/寫的目錄,例如寫的目錄,例如/VAR、/tmp,應該放在,應該放在tmpfs文件系統(tǒng)中,以減少對文件系統(tǒng)中,以減少對Flash的擦寫次數(shù),延長的擦寫次數(shù),延長flash的使用壽命。的使用壽命。tmptfs文件系統(tǒng)中的變化在下次啟動后是不文件系統(tǒng)中的變化在下次啟動后是不會保存的。會保存的。嵌入式文件系統(tǒng)及移植
12、嵌入式文件系統(tǒng)及移植v 對于那些需要進行讀、寫,并且在下次啟動之后也能將更對于那些需要進行讀、寫,并且在下次啟動之后也能將更新信息保存的文件,則應該放入日志型文件系統(tǒng)里。如果新信息保存的文件,則應該放入日志型文件系統(tǒng)里。如果采用的是采用的是NOR型閃存,則應選擇型閃存,則應選擇JFFs2文件系統(tǒng);如果是文件系統(tǒng);如果是NAND 閃存,則應選擇閃存,則應選擇YAFFS文件系統(tǒng)。文件系統(tǒng)。嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 混合型文件系統(tǒng)格式的設(shè)計方法混合型文件系統(tǒng)格式的設(shè)計方法v 綜合考慮存儲空間和系統(tǒng)可用性因素,適用于嵌入式系統(tǒng)綜合考慮存儲空間和系統(tǒng)可用性因素,適用于嵌入式系統(tǒng)的文件系
13、統(tǒng)格式各有千秋,因此可以在嵌入式系統(tǒng)中采用的文件系統(tǒng)格式各有千秋,因此可以在嵌入式系統(tǒng)中采用混雜模式的文件系統(tǒng)格式混雜模式的文件系統(tǒng)格式嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 嵌入式根文件系統(tǒng)的制作嵌入式根文件系統(tǒng)的制作v 結(jié)合結(jié)合UP-NetARM2410-S試驗箱介紹試驗箱介紹 Linux根文件系統(tǒng)的根文件系統(tǒng)的構(gòu)建過程構(gòu)建過程 1.文件系統(tǒng)方案文件系統(tǒng)方案 2.文件系統(tǒng)構(gòu)建流程文件系統(tǒng)構(gòu)建流程 3.根文件系統(tǒng)的實現(xiàn)根文件系統(tǒng)的實現(xiàn)嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 文件系統(tǒng)方案文件系統(tǒng)方案v 根文件系統(tǒng):根文件系統(tǒng): 根文件系統(tǒng)是系統(tǒng)啟動時掛載的第一個文件系統(tǒng),其根文件系統(tǒng)是
14、系統(tǒng)啟動時掛載的第一個文件系統(tǒng),其他的文件系統(tǒng)需要在跟文件系統(tǒng)目錄中建立節(jié)點后再他的文件系統(tǒng)需要在跟文件系統(tǒng)目錄中建立節(jié)點后再掛載。掛載。 UP-NetARM2410-S 有一個有一個 64M 的的 NANDFLASH,根,根文件系統(tǒng)和用戶文件系統(tǒng)都建立在該文件系統(tǒng)和用戶文件系統(tǒng)都建立在該flash 的后大半部的后大半部分。該分。該 flash 的前小半部分用來存放的前小半部分用來存放 bootloader 和和 kernel 映像。映像。 根文件系統(tǒng)選用了根文件系統(tǒng)選用了 Cramfs 文件系統(tǒng)文件系統(tǒng)格式。格式。嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 用戶文件系統(tǒng):用戶文件系統(tǒng): 由于
15、由于 Cramfs 為只讀文件系統(tǒng),為了得到可讀寫的文件為只讀文件系統(tǒng),為了得到可讀寫的文件系統(tǒng),用戶文件系統(tǒng)采用系統(tǒng),用戶文件系統(tǒng)采用 YAFFS文件系統(tǒng)文件系統(tǒng)格式。用戶格式。用戶文件系統(tǒng)掛載于根文件系統(tǒng)下的文件系統(tǒng)掛載于根文件系統(tǒng)下的/mnt/yaffs 目錄。目錄。v 臨時文件系統(tǒng):臨時文件系統(tǒng): 采用了采用了 Ramfs 文件系統(tǒng)文件系統(tǒng)。根目錄下的。根目錄下的/var,/tmp 目錄目錄為為 Ramfs 臨時文件系統(tǒng)的掛載點臨時文件系統(tǒng)的掛載點嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 文件系統(tǒng)構(gòu)建流程文件系統(tǒng)構(gòu)建流程v 在嵌人式在嵌人式 Linux 系統(tǒng)中混合使用系統(tǒng)中混合使用
16、Cramfs、YAFFS 和和 Ramfs 三種文件系統(tǒng)的實現(xiàn)思路如下:三種文件系統(tǒng)的實現(xiàn)思路如下:v 1. 配置內(nèi)核:將內(nèi)核對配置內(nèi)核:將內(nèi)核對 MTD,Cramfs,YAFFS 以及以及 Ramfs 文件系統(tǒng)的支持功能編譯進內(nèi)核。文件系統(tǒng)的支持功能編譯進內(nèi)核。v 2. 劃分劃分 Flash 分區(qū)分區(qū):對對 Flash 物理空間進行分區(qū),以便在物理空間進行分區(qū),以便在不同的分區(qū)上存放不同的數(shù)據(jù),采用不同的文件系統(tǒng)格式不同的分區(qū)上存放不同的數(shù)據(jù),采用不同的文件系統(tǒng)格式;必要時編寫必要時編寫 MAPS 文件。今修改系統(tǒng)腳本文件。今修改系統(tǒng)腳本,在系統(tǒng)啟動后在系統(tǒng)啟動后利用腳本掛載文件系統(tǒng)。創(chuàng)建文
17、件系統(tǒng)鏡像文件利用腳本掛載文件系統(tǒng)。創(chuàng)建文件系統(tǒng)鏡像文件,利用工利用工具生成文件系統(tǒng)鏡像文件,并通過具生成文件系統(tǒng)鏡像文件,并通過 Flash 燒寫工具將鏡像燒寫工具將鏡像文件燒寫到文件燒寫到 Flash 物理空間。物理空間。 嵌入式文件系統(tǒng)及移植嵌入式文件系統(tǒng)及移植v 根文件系統(tǒng)的實現(xiàn)根文件系統(tǒng)的實現(xiàn)v 制作制作 Cramfs 格式的根文件系統(tǒng):一個使用格式的根文件系統(tǒng):一個使用 linux 內(nèi)核的內(nèi)核的嵌入式系統(tǒng)中的嵌入式系統(tǒng)中的 root 文件系統(tǒng)必須包括支持完整文件系統(tǒng)必須包括支持完整 linux 系系統(tǒng)的全部東西,因此,它至少應包括:統(tǒng)的全部東西,因此,它至少應包括:v 基本文件系統(tǒng)
18、結(jié)構(gòu),至少含有目錄基本文件系統(tǒng)結(jié)構(gòu),至少含有目錄/dev、/proc、/bin、/etc、/lib、/usrv 最基本的應用程序,如最基本的應用程序,如 sh、ls、cp、mv 等等v 最低限度的配置文件,如最低限度的配置文件,如 inittab、fstab 等等v 必要的設(shè)備支持:必要的設(shè)備支持:/dev/null、/dev/console、/dev/ tty*、/dev/ttyS*、對應、對應 flash 分區(qū)的設(shè)備節(jié)點等分區(qū)的設(shè)備節(jié)點等v 基本程序運行所需的函數(shù)庫:基本程序運行所需的函數(shù)庫:Glibclinux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v linux設(shè)備驅(qū)動作用設(shè)備驅(qū)動作用v 驅(qū)動程序驅(qū)動
19、程序Device Driver,全稱為,全稱為“設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序”, 是一種可以使計是一種可以使計算機和設(shè)備通信的特殊程序,可以說相當于硬件的接口,操作系統(tǒng)只算機和設(shè)備通信的特殊程序,可以說相當于硬件的接口,操作系統(tǒng)只有通過這個接口,才能控制硬件設(shè)備的工作,假如某設(shè)備的驅(qū)動程序有通過這個接口,才能控制硬件設(shè)備的工作,假如某設(shè)備的驅(qū)動程序未能正確安裝,便不能正常工作。未能正確安裝,便不能正常工作。v Linux 系統(tǒng)內(nèi)核通過設(shè)備驅(qū)動程序與外圍設(shè)備進行交互,設(shè)備驅(qū)動程系統(tǒng)內(nèi)核通過設(shè)備驅(qū)動程序與外圍設(shè)備進行交互,設(shè)備驅(qū)動程序是序是Linux內(nèi)核的一部分,它是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)內(nèi)
20、核的一部分,它是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)通過定義的接口控制一個或多個設(shè)備。對應用程序而言,設(shè)備和函數(shù)通過定義的接口控制一個或多個設(shè)備。對應用程序而言,設(shè)備驅(qū)動程序隱藏了設(shè)備的具體細節(jié),對各種不同設(shè)備提供一致的接口。驅(qū)動程序隱藏了設(shè)備的具體細節(jié),對各種不同設(shè)備提供一致的接口。不同于不同于windows驅(qū)動程序,驅(qū)動程序,Linux設(shè)備驅(qū)動程序在與硬件設(shè)備之間建設(shè)備驅(qū)動程序在與硬件設(shè)備之間建立了標準的抽象接口。通過這個接口,用戶可以像處理普通文件一樣,立了標準的抽象接口。通過這個接口,用戶可以像處理普通文件一樣,通過通過open,close,read,write等系統(tǒng)調(diào)用對設(shè)備進行操
21、作,如此一等系統(tǒng)調(diào)用對設(shè)備進行操作,如此一來也大大簡化了來也大大簡化了linux驅(qū)動程序的開發(fā)。驅(qū)動程序的開發(fā)。 linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 設(shè)備驅(qū)動程序的主要功能設(shè)備驅(qū)動程序的主要功能 對設(shè)備進行初始化。對設(shè)備進行初始化。 啟動或停止設(shè)備的運行。啟動或停止設(shè)備的運行。 把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。 讀取應用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應用程序讀取應用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應用程序請求的數(shù)據(jù)。請求的數(shù)據(jù)。 檢測和處理設(shè)備出現(xiàn)的錯誤等。檢測和處理設(shè)備出現(xiàn)的錯誤等。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 設(shè)備驅(qū)動程序有如下特點:
22、設(shè)備驅(qū)動程序有如下特點: 驅(qū)動程序是與設(shè)備相關(guān)的。驅(qū)動程序是與設(shè)備相關(guān)的。 驅(qū)動程序的代碼由內(nèi)核統(tǒng)一管理。驅(qū)動程序的代碼由內(nèi)核統(tǒng)一管理。 驅(qū)動程序在具有特權(quán)級別的內(nèi)核態(tài)下運行。驅(qū)動程序在具有特權(quán)級別的內(nèi)核態(tài)下運行。 設(shè)備驅(qū)動程序是輸入輸出系統(tǒng)的一部分。設(shè)備驅(qū)動程序是輸入輸出系統(tǒng)的一部分。 驅(qū)動程序是為某個進程服務的,其執(zhí)行過程仍處在進驅(qū)動程序是為某個進程服務的,其執(zhí)行過程仍處在進程運行的過程中,即處于進程的上下文中。程運行的過程中,即處于進程的上下文中。 若驅(qū)動程序需要等待設(shè)備的某種狀態(tài),它將阻塞當前若驅(qū)動程序需要等待設(shè)備的某種狀態(tài),它將阻塞當前進程,把進程加入到該設(shè)備的等待隊列中。進程,把進
23、程加入到該設(shè)備的等待隊列中。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v linux設(shè)備驅(qū)動程序的基本結(jié)構(gòu)設(shè)備驅(qū)動程序的基本結(jié)構(gòu)linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 應用程序、庫、內(nèi)核、驅(qū)動程序的關(guān)系:應用程序、庫、內(nèi)核、驅(qū)動程序的關(guān)系:v 應用程序調(diào)用應用程序函數(shù)庫完成功能、應用程序以文件應用程序調(diào)用應用程序函數(shù)庫完成功能、應用程序以文件形式訪問各種資源、應用程序函數(shù)庫、部分函數(shù)直接完成形式訪問各種資源、應用程序函數(shù)庫、部分函數(shù)直接完成功能、部分函數(shù)通過系統(tǒng)調(diào)用。由內(nèi)核完成內(nèi)核處理系統(tǒng)功能、部分函數(shù)通過系統(tǒng)調(diào)用。由內(nèi)核完成內(nèi)核處理系統(tǒng)調(diào)用。調(diào)用設(shè)備驅(qū)動程序,設(shè)備驅(qū)動直接與硬件通信。調(diào)用。調(diào)用設(shè)備驅(qū)動
24、程序,設(shè)備驅(qū)動直接與硬件通信。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v linux設(shè)備驅(qū)動的分類設(shè)備驅(qū)動的分類v Linux 的方式看待設(shè)備可區(qū)分為三種基本設(shè)備:的方式看待設(shè)備可區(qū)分為三種基本設(shè)備: 字符設(shè)備字符設(shè)備 塊設(shè)備塊設(shè)備 網(wǎng)絡設(shè)備網(wǎng)絡設(shè)備 linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 字符設(shè)備字符設(shè)備 :v 一個字符一個字符( char ) 設(shè)備是一種可以當作一個設(shè)備是一種可以當作一個字節(jié)流字節(jié)流來存取的設(shè)備來存取的設(shè)備( 如同如同一個文件一個文件 ); 一個字符驅(qū)動負責實現(xiàn)這種行為。一個字符驅(qū)動負責實現(xiàn)這種行為。 這樣的驅(qū)動常常至少這樣的驅(qū)動常常至少實現(xiàn)實現(xiàn) open, close, read
25、, 和和 write 系統(tǒng)調(diào)用。系統(tǒng)調(diào)用。 v 文本控制臺文本控制臺( /dev/console )和串口和串口( /dev/ttyS0 )是字符設(shè)備的例子是字符設(shè)備的例子, 因因為它們很好地展現(xiàn)了流的抽象。為它們很好地展現(xiàn)了流的抽象。v 字符設(shè)備通過字符設(shè)備通過文件系統(tǒng)結(jié)點文件系統(tǒng)結(jié)點來存取來存取, 例如例如 /dev/tty1 和和 /dev/lp0。 v 在一個字符設(shè)備和一個普通文件之間唯一有關(guān)的不同就是在一個字符設(shè)備和一個普通文件之間唯一有關(guān)的不同就是, 你經(jīng)??赡憬?jīng)常可以在普通文件中移來移去以在普通文件中移來移去, 但是但是大部分字符設(shè)備僅僅是數(shù)據(jù)通道大部分字符設(shè)備僅僅是數(shù)據(jù)通道,
26、你只你只能順序存取能順序存取。當然。當然,也存在看起來象數(shù)據(jù)區(qū)的字符設(shè)備也存在看起來象數(shù)據(jù)區(qū)的字符設(shè)備, 你可以在里面你可以在里面移來移去。移來移去。 例如例如, frame grabber 經(jīng)常這樣經(jīng)常這樣, 應用程序可以使用應用程序可以使用 mmap 或者或者 lseek 存取整個要求的圖像。存取整個要求的圖像。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 塊設(shè)備塊設(shè)備 v 如同字符設(shè)備如同字符設(shè)備, 塊設(shè)備通過位于塊設(shè)備通過位于 /dev 目錄的文件系統(tǒng)結(jié)點來存取。目錄的文件系統(tǒng)結(jié)點來存取。 一一個塊設(shè)備個塊設(shè)備(例如一個磁盤例如一個磁盤)應該是可以駐有一個文件系統(tǒng)的。應該是可以駐有一個文件系統(tǒng)
27、的。v 在大部分的在大部分的 Unix 系統(tǒng)中系統(tǒng)中, 一個塊設(shè)備只能處理這樣的一個塊設(shè)備只能處理這樣的 I/O 操作操作, 傳送傳送一個或多個長度經(jīng)常是一個或多個長度經(jīng)常是 512 字節(jié)字節(jié)( 或一個更大的或一個更大的 2 的冪的數(shù)的冪的數(shù) )的整塊。的整塊。 v Linux中則相反中則相反, 允許應用程序讀寫一個塊設(shè)備象一個字符設(shè)備一樣,允許應用程序讀寫一個塊設(shè)備象一個字符設(shè)備一樣,它允許一次傳送任意數(shù)目的字節(jié)。它允許一次傳送任意數(shù)目的字節(jié)。 結(jié)果就是結(jié)果就是, 塊和字符設(shè)備的區(qū)別僅塊和字符設(shè)備的區(qū)別僅僅在內(nèi)核在內(nèi)部管理數(shù)據(jù)的方式上僅在內(nèi)核在內(nèi)部管理數(shù)據(jù)的方式上, 并且因此在內(nèi)核并且因此在
28、內(nèi)核/驅(qū)動的軟件接口驅(qū)動的軟件接口上不同上不同。 如同一個字符設(shè)備如同一個字符設(shè)備, 每個塊設(shè)備都通過一個文件系統(tǒng)結(jié)點被每個塊設(shè)備都通過一個文件系統(tǒng)結(jié)點被存取的存取的, 它們之間的區(qū)別對用戶是透明的。它們之間的區(qū)別對用戶是透明的。 塊驅(qū)動和字符驅(qū)動相比塊驅(qū)動和字符驅(qū)動相比, 與內(nèi)核的接口完全不同。與內(nèi)核的接口完全不同。 linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 網(wǎng)絡設(shè)備網(wǎng)絡設(shè)備v 任何網(wǎng)絡事務都通過一個接口來進行任何網(wǎng)絡事務都通過一個接口來進行, 就是說就是說, 一個能夠與一個能夠與其他主機交換數(shù)據(jù)的設(shè)備。其他主機交換數(shù)據(jù)的設(shè)備。 通常通常, 一個接口是一個硬件設(shè)一個接口是一個硬件設(shè)備備, 但是它
29、也可能是一個純粹的軟件設(shè)備但是它也可能是一個純粹的軟件設(shè)備, 比如回環(huán)接口。比如回環(huán)接口。 一個網(wǎng)絡接口負責發(fā)送和接收數(shù)據(jù)報文一個網(wǎng)絡接口負責發(fā)送和接收數(shù)據(jù)報文, 在內(nèi)核網(wǎng)絡子系在內(nèi)核網(wǎng)絡子系統(tǒng)的驅(qū)動下統(tǒng)的驅(qū)動下, 不必知道單個事務是如何映射到實際的被發(fā)不必知道單個事務是如何映射到實際的被發(fā)送的報文上的。送的報文上的。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 字符設(shè)備與塊設(shè)備的主要區(qū)別是:字符設(shè)備與塊設(shè)備的主要區(qū)別是:v 在對字符設(shè)備發(fā)出讀在對字符設(shè)備發(fā)出讀/寫請求時,實際的硬件寫請求時,實際的硬件I/O一般緊接一般緊接著發(fā)生。塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),著發(fā)生。塊設(shè)備則不然,它利
30、用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),若用戶進程對設(shè)備的請求能滿足用戶的要求,就返回請求若用戶進程對設(shè)備的請求能滿足用戶的要求,就返回請求的數(shù)據(jù);否則,就調(diào)用請求函數(shù)來進行實際的的數(shù)據(jù);否則,就調(diào)用請求函數(shù)來進行實際的I/O操作。操作。塊設(shè)備主要是針對磁盤等慢速設(shè)備設(shè)計的,以免耗費過多塊設(shè)備主要是針對磁盤等慢速設(shè)備設(shè)計的,以免耗費過多的的CPU時間用來等待。時間用來等待。v 網(wǎng)絡設(shè)備可以通過網(wǎng)絡設(shè)備可以通過BSD套接口訪問數(shù)據(jù)。套接口訪問數(shù)據(jù)。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v linux設(shè)備文件和設(shè)備文件系統(tǒng)設(shè)備文件和設(shè)備文件系統(tǒng)v Linux是一種類是一種類Unix系統(tǒng),系統(tǒng),Unix的一個基本特點
31、是的一個基本特點是“一切一切皆為文件皆為文件”,它抽象了設(shè)備的處理,將所有的硬件設(shè)備都,它抽象了設(shè)備的處理,將所有的硬件設(shè)備都像普通文件一樣看待,也就是說硬件可以跟普通文件一樣像普通文件一樣看待,也就是說硬件可以跟普通文件一樣來打開、關(guān)閉和讀寫。來打開、關(guān)閉和讀寫。 v 系統(tǒng)中設(shè)備都用一個設(shè)備特殊文件代表,叫做設(shè)備文件,系統(tǒng)中設(shè)備都用一個設(shè)備特殊文件代表,叫做設(shè)備文件,設(shè)備類型、主次設(shè)備號是內(nèi)核與設(shè)備驅(qū)動程序通信時所使設(shè)備類型、主次設(shè)備號是內(nèi)核與設(shè)備驅(qū)動程序通信時所使用的,但是對于開發(fā)應用程序的用戶來說比較難于理解和用的,但是對于開發(fā)應用程序的用戶來說比較難于理解和記憶,所以記憶,所以 Lin
32、ux使用了設(shè)備文件的概念來統(tǒng)一對設(shè)備的使用了設(shè)備文件的概念來統(tǒng)一對設(shè)備的訪問接口,在引入設(shè)備文件系統(tǒng)訪問接口,在引入設(shè)備文件系統(tǒng)devfs之前之前 Linux 將設(shè)備將設(shè)備文件放在文件放在/dev目錄下,設(shè)備的命名一般為設(shè)備文件名數(shù)目錄下,設(shè)備的命名一般為設(shè)備文件名數(shù)字或字母表示的子類,例如字或字母表示的子類,例如/dev/hda1、/dev/hda2 等。等。linux設(shè)備驅(qū)動概述設(shè)備驅(qū)動概述v 每個設(shè)備文件都有其文件屬性每個設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還是,表示是字符設(shè)備還是塊設(shè)備。另外每個文件都有塊設(shè)備。另外每個文件都有2個設(shè)備號,第一個是主設(shè)備個設(shè)備號,第一個是主設(shè)
33、備號,唯一標識一個設(shè)備。主設(shè)備號相同的設(shè)備使用相同的號,唯一標識一個設(shè)備。主設(shè)備號相同的設(shè)備使用相同的驅(qū)動程序;第二個是從設(shè)備號,標識使用同一個設(shè)備驅(qū)動驅(qū)動程序;第二個是從設(shè)備號,標識使用同一個設(shè)備驅(qū)動程序的、不同的硬件設(shè)備。程序的、不同的硬件設(shè)備。 v 在在 Linux 2.4 內(nèi)核中引入了設(shè)備文件系統(tǒng)內(nèi)核中引入了設(shè)備文件系統(tǒng)devfs,所有設(shè)備,所有設(shè)備文件作為一個可以掛載的文件系統(tǒng),這樣就可以被文件系文件作為一個可以掛載的文件系統(tǒng),這樣就可以被文件系統(tǒng)進行統(tǒng)一管理,從而設(shè)備文件就可以掛載到任何需要的統(tǒng)進行統(tǒng)一管理,從而設(shè)備文件就可以掛載到任何需要的地方。命名規(guī)則也發(fā)生了變化,一般將主設(shè)備
34、建立一個目地方。命名規(guī)則也發(fā)生了變化,一般將主設(shè)備建立一個目錄,再將具體的子設(shè)備文件建立在此目錄下。比如在錄,再將具體的子設(shè)備文件建立在此目錄下。比如在 UP-NETARM2410-S 中的中的 MTD 設(shè)備為:設(shè)備為:/dev/mtdblock/0。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v linux設(shè)備驅(qū)動的加載方式設(shè)備驅(qū)動的加載方式v 設(shè)備驅(qū)動程序是設(shè)備驅(qū)動程序是Linux內(nèi)核的重要組成部分,控制了操作內(nèi)核的重要組成部分,控制了操作系統(tǒng)和硬件設(shè)備之間的交互。系統(tǒng)和硬件設(shè)備之間的交互。v Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都以文件的形
35、式存放在以文件的形式存放在/dev目錄下,成為設(shè)備文件。目錄下,成為設(shè)備文件。v 應用程序可以打開、關(guān)閉、讀寫這些設(shè)備文件,對設(shè)備的應用程序可以打開、關(guān)閉、讀寫這些設(shè)備文件,對設(shè)備的操作就像操作普通的數(shù)據(jù)文件一樣簡便操作就像操作普通的數(shù)據(jù)文件一樣簡便設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 在在LINUX下加載驅(qū)動程序可以采用兩種方式。下加載驅(qū)動程序可以采用兩種方式。 靜態(tài)加載靜態(tài)加載 動態(tài)加載動態(tài)加載v 靜態(tài)加載就是把驅(qū)動程序直接編譯到內(nèi)核里,在執(zhí)行靜態(tài)加載就是把驅(qū)動程序直接編譯到內(nèi)核里,在執(zhí)行make menuconfig命令進行內(nèi)核配置裁剪時,在窗口中可命令進行內(nèi)核配置裁剪時,在窗口中可以選擇
36、是否編譯入內(nèi)核,還是放入以選擇是否編譯入內(nèi)核,還是放入/lib/modules/下相應內(nèi)下相應內(nèi)核版本目錄中,還是不選。驅(qū)動編譯進內(nèi)核后,系統(tǒng)啟動核版本目錄中,還是不選。驅(qū)動編譯進內(nèi)核后,系統(tǒng)啟動后可以直接調(diào)用。后可以直接調(diào)用。v 靜態(tài)加載的缺點是調(diào)試起來比較麻煩,每次修改一個地方靜態(tài)加載的缺點是調(diào)試起來比較麻煩,每次修改一個地方都要重新編譯下載內(nèi)核,效率較低。都要重新編譯下載內(nèi)核,效率較低。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 動態(tài)加載利用了動態(tài)加載利用了LINUX的的module特性,可以在系統(tǒng)啟動特性,可以在系統(tǒng)啟動后用后用insmod命令把驅(qū)動程序(命令把驅(qū)動程序(.o文件)添加上去,在
37、不需文件)添加上去,在不需要的時候用要的時候用rmmod命令來卸載。命令來卸載。v 在臺式機上一般采用動態(tài)加載的方式。在嵌入式產(chǎn)品里可在臺式機上一般采用動態(tài)加載的方式。在嵌入式產(chǎn)品里可以先用動態(tài)加載的方式來調(diào)試,調(diào)試完畢后再編譯到內(nèi)核以先用動態(tài)加載的方式來調(diào)試,調(diào)試完畢后再編譯到內(nèi)核里。里。v 動態(tài)加載動態(tài)加載是將驅(qū)動模塊加載到內(nèi)核中,而不能放動態(tài)加載動態(tài)加載是將驅(qū)動模塊加載到內(nèi)核中,而不能放入入/lib/modules/下。下。v 下圖是將一個設(shè)備驅(qū)動模塊動態(tài)掛接、卸載和系統(tǒng)調(diào)用的下圖是將一個設(shè)備驅(qū)動模塊動態(tài)掛接、卸載和系統(tǒng)調(diào)用的全過程。全過程。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接
38、口設(shè)備驅(qū)動程序接口v 下面看一下有關(guān)模塊的命令,在加載驅(qū)動程序要用到:下面看一下有關(guān)模塊的命令,在加載驅(qū)動程序要用到:lsmod、modprob、insmod、rmmod、modinfo。v lsmod命令:命令:lsmod查看當前加載到內(nèi)核中的所有驅(qū)動模塊,查看當前加載到內(nèi)核中的所有驅(qū)動模塊,同時提供其它一些信息,比如其它模塊是否在使用另一個同時提供其它一些信息,比如其它模塊是否在使用另一個模塊。例如:模塊。例如:#lsmod (與(與cat /proc/modules 得出的內(nèi)容是一致的)得出的內(nèi)容是一致的)Module Size Used by Not taintedradeon 115
39、364 1 agpgart 56664 3設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v rmmod命令:如果后面有命令:如果后面有autoclean,則該模塊可以被,則該模塊可以被rmmod -a命令自動清洗。命令自動清洗。rmmod -a命令會將目前有命令會將目前有autoclean的模塊卸載,如果這時候某個模塊未被使用,則的模塊卸載,如果這時候某個模塊未被使用,則將該模塊標記為將該模塊標記為autoclean。如果在行尾的。如果在行尾的 括號內(nèi)有模塊括號內(nèi)有模塊名稱,則括號內(nèi)的模塊就依賴于該模塊。名稱,則括號內(nèi)的模塊就依賴于該模塊。v 例如:例如: cdrom 34144 0 sr_mod ide-
40、cdv 其中其中ide-cd及及sr_mod模塊就依賴于模塊就依賴于cdrom模塊。系統(tǒng)的模模塊。系統(tǒng)的模塊文件保存在塊文件保存在/lib/modules/2.6.XXX/kerne目錄中,根據(jù)分目錄中,根據(jù)分類分別在類分別在fs、net等子目錄中,他們的互相依存關(guān)系則保存等子目錄中,他們的互相依存關(guān)系則保存在在/lib/modules/2.6.XXX/modules.dep 文件中。文件中。 需要注意,需要注意,該文件不僅寫入了模塊的依存關(guān)系,同時內(nèi)核查找模塊也該文件不僅寫入了模塊的依存關(guān)系,同時內(nèi)核查找模塊也是在這個文件中。是在這個文件中。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v insmod命
41、令:是插入模塊的命令,但是它不會自動解決依命令:是插入模塊的命令,但是它不會自動解決依存關(guān)系,所以一般加載內(nèi)核模塊時使用的命令為存關(guān)系,所以一般加載內(nèi)核模塊時使用的命令為modprobe。使用。使用modprobe命令,可以智能插入模塊,它命令,可以智能插入模塊,它可以根據(jù)模塊間依存關(guān)系,以及可以根據(jù)模塊間依存關(guān)系,以及/etc/modules.conf文件中文件中的內(nèi)容智能插入模塊。的內(nèi)容智能插入模塊。v modinfo命令:用來查看模塊信息,如命令:用來查看模塊信息,如modinfo -d cdrom。 設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v Linux操作
42、系統(tǒng)通過系統(tǒng)調(diào)用和硬件中斷完成從用戶空間操作系統(tǒng)通過系統(tǒng)調(diào)用和硬件中斷完成從用戶空間到內(nèi)核空間的控制轉(zhuǎn)移。到內(nèi)核空間的控制轉(zhuǎn)移。v 設(shè)備驅(qū)動模塊的功能就是擴展內(nèi)核的功能,主要完成兩部設(shè)備驅(qū)動模塊的功能就是擴展內(nèi)核的功能,主要完成兩部分任務:一個是系統(tǒng)調(diào)用,另一個是處理中斷。分任務:一個是系統(tǒng)調(diào)用,另一個是處理中斷。v 系統(tǒng)調(diào)用部分則是對設(shè)備的操作過程,比如系統(tǒng)調(diào)用部分則是對設(shè)備的操作過程,比如open,read,write,ioctl等操作,設(shè)備驅(qū)動程序所提供的這組入口點由等操作,設(shè)備驅(qū)動程序所提供的這組入口點由幾個結(jié)構(gòu)向系統(tǒng)進行說明,分別是幾個結(jié)構(gòu)向系統(tǒng)進行說明,分別是file_operat
43、ions數(shù)據(jù)結(jié)數(shù)據(jù)結(jié)構(gòu)、構(gòu)、inode數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)和file 數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)。v 內(nèi)核內(nèi)部通過內(nèi)核內(nèi)部通過file結(jié)構(gòu)識別設(shè)備,通過結(jié)構(gòu)識別設(shè)備,通過file_operations數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)提供文件系統(tǒng)的入口點函數(shù),也就是訪問設(shè)備驅(qū)動的結(jié)構(gòu)提供文件系統(tǒng)的入口點函數(shù),也就是訪問設(shè)備驅(qū)動的函數(shù),結(jié)構(gòu)中的每一個成員都對應著一個系統(tǒng)調(diào)用。函數(shù),結(jié)構(gòu)中的每一個成員都對應著一個系統(tǒng)調(diào)用。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 在嵌入式系統(tǒng)的開發(fā)中,我們一般僅僅實現(xiàn)其中幾個接口在嵌入式系統(tǒng)的開發(fā)中,我們一般僅僅實現(xiàn)其中幾個接口函數(shù):函數(shù):read、write、open、ioctl及及release就
44、可以完成應用就可以完成應用系統(tǒng)需要的功能。系統(tǒng)需要的功能。v 寫驅(qū)動程序的任務之一就是完成寫驅(qū)動程序的任務之一就是完成file_operations中的函數(shù)中的函數(shù)指針。通常所說的設(shè)備驅(qū)動程序接口是指結(jié)構(gòu)指針。通常所說的設(shè)備驅(qū)動程序接口是指結(jié)構(gòu) file_operations,它定義在,它定義在include/linux/fs.h 中。中。v file_operations 數(shù)據(jù)結(jié)構(gòu)定義如下:數(shù)據(jù)結(jié)構(gòu)定義如下: 設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口struct file_operations struct module *owner;loff_t (*llseek) (struct file *,
45、 loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, size_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 *, uns
46、igned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int);
47、int (*lock) (struct file *, int, struct file_lock *); #ifdef MAGIC_ROM_PTR int (*romptr) (struct file *, struct vm_area_struct *);#endif /* MAGIC_ROM_PTR */;設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 常用的操作包括以下幾種:常用的操作包括以下幾種: v *lseek,移動文件指針的位置,只用于隨機存取設(shè)備。,移動文件指針的位置,只用于隨機存取設(shè)備。 v *read,進行讀操作,參數(shù),進行讀操作,參數(shù)buf為存放讀取結(jié)果的緩沖區(qū),為存放讀取結(jié)果的緩
48、沖區(qū),count為所要讀取的數(shù)據(jù)長度。返回值為負表示讀取操作為所要讀取的數(shù)據(jù)長度。返回值為負表示讀取操作發(fā)生錯誤;否則,返回實際讀取的字節(jié)數(shù)。對于字符型,發(fā)生錯誤;否則,返回實際讀取的字節(jié)數(shù)。對于字符型,要求讀取的字節(jié)數(shù)和返回的實際讀取字節(jié)數(shù)都必須是要求讀取的字節(jié)數(shù)和返回的實際讀取字節(jié)數(shù)都必須是inode-i_blksize的倍數(shù)。的倍數(shù)。 v *write,進行寫操作,與,進行寫操作,與read類似。類似。v *readdir,取得下一個目錄入口點,只有與文件系統(tǒng)相關(guān),取得下一個目錄入口點,只有與文件系統(tǒng)相關(guān)的設(shè)備程序才使用。的設(shè)備程序才使用。 設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v *sele
49、ct,進行選擇操作。如果驅(qū)動程序沒有提供,進行選擇操作。如果驅(qū)動程序沒有提供select入口,入口,select操作會認為設(shè)備已經(jīng)準備好進行任何操作會認為設(shè)備已經(jīng)準備好進行任何I/O操作。操作。 v *ioctl,進行讀、寫以外的其他操作,參數(shù),進行讀、寫以外的其他操作,參數(shù)cmd為自定義的為自定義的命令命令 。v *mmap,用于把設(shè)備的內(nèi)容映射到地址空間,一般只有,用于把設(shè)備的內(nèi)容映射到地址空間,一般只有塊設(shè)備驅(qū)動程序使用塊設(shè)備驅(qū)動程序使用 。v *open,打開設(shè)備準備進行,打開設(shè)備準備進行I/O操作。返回操作。返回0表示打開成功,表示打開成功,返回負數(shù)表示失敗。如果驅(qū)動程序沒有提供返回
50、負數(shù)表示失敗。如果驅(qū)動程序沒有提供open入口,則入口,則只要只要/dev/driver文件存在就認為打開成功。文件存在就認為打開成功。 v *release,即,即close操作。操作。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v linux設(shè)備控制方式設(shè)備控制方式 1查詢方式查詢方式 2中斷方式中斷方式 3直接訪問內(nèi)存(直接訪問內(nèi)存(DMA)方式)方式設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 1查詢方式查詢方式v 設(shè)備驅(qū)動程序通過設(shè)備的設(shè)備驅(qū)動程序通過設(shè)備的I/O端口空間,以及存儲器空間端口空間,以及存儲器空間完成數(shù)據(jù)的交換。完成數(shù)據(jù)的交換。v 如網(wǎng)卡一般將自己的內(nèi)部寄存器映射為設(shè)備的如網(wǎng)卡一般將自己的內(nèi)
51、部寄存器映射為設(shè)備的I/O端口,端口,而顯卡則利用大量的存儲器空間作為視頻信息存儲空間。而顯卡則利用大量的存儲器空間作為視頻信息存儲空間。利用這些地址空間,驅(qū)動程序可以向外設(shè)發(fā)送指定的操作利用這些地址空間,驅(qū)動程序可以向外設(shè)發(fā)送指定的操作指令。通常來講,由于外設(shè)的操作耗時較長,因此,當處指令。通常來講,由于外設(shè)的操作耗時較長,因此,當處理器實際執(zhí)行了操作指令之后,驅(qū)動程序可采用查詢方式理器實際執(zhí)行了操作指令之后,驅(qū)動程序可采用查詢方式等待外設(shè)完成操作。等待外設(shè)完成操作。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 查詢方式的優(yōu)點是硬件開銷小,使用起來比較簡單。但在查詢方式的優(yōu)點是硬件開銷小,使用起來比較
52、簡單。但在此方式下,此方式下,CPU要不斷地查詢外設(shè)的狀態(tài),當外設(shè)未準備要不斷地查詢外設(shè)的狀態(tài),當外設(shè)未準備好時,就只能循環(huán)等待,不能執(zhí)行其他程序,這樣就浪費好時,就只能循環(huán)等待,不能執(zhí)行其他程序,這樣就浪費了了CPU的大量時間,降低了處理器的利用率。的大量時間,降低了處理器的利用率。 設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 2中斷方式中斷方式v 當當CPU進行主程序操作時,外設(shè)的數(shù)據(jù)已存入端口的數(shù)據(jù)進行主程序操作時,外設(shè)的數(shù)據(jù)已存入端口的數(shù)據(jù)輸入寄存器,或端口的數(shù)據(jù)輸出寄存器已空,此時由外設(shè)輸入寄存器,或端口的數(shù)據(jù)輸出寄存器已空,此時由外設(shè)通過接口電路向通過接口電路向CPU發(fā)出中斷請求信號。發(fā)出
53、中斷請求信號。CPU在滿足一定在滿足一定條件下,暫停執(zhí)行當前正在執(zhí)行的主程序,轉(zhuǎn)入執(zhí)行相應條件下,暫停執(zhí)行當前正在執(zhí)行的主程序,轉(zhuǎn)入執(zhí)行相應能夠進行輸入能夠進行輸入/輸出操作的子程序,待輸入輸出操作的子程序,待輸入/輸出操作執(zhí)行輸出操作執(zhí)行完畢之后,完畢之后,CPU再返回并繼續(xù)執(zhí)行原來被中斷的主程序。再返回并繼續(xù)執(zhí)行原來被中斷的主程序。這樣,這樣,CPU就避免了把大量時間耗費在等待、查詢外設(shè)狀就避免了把大量時間耗費在等待、查詢外設(shè)狀態(tài)的操作上,使其工作效率得以大大提高。態(tài)的操作上,使其工作效率得以大大提高。 設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 能夠向能夠向CPU發(fā)出中斷請求的設(shè)備或事件稱為中斷
54、源。發(fā)出中斷請求的設(shè)備或事件稱為中斷源。v 中斷源向中斷源向CPU發(fā)出中斷請求,若優(yōu)先級別最高,則發(fā)出中斷請求,若優(yōu)先級別最高,則CPU在在滿足一定的條件時,可中斷當前程序的運行,保護好被中滿足一定的條件時,可中斷當前程序的運行,保護好被中斷的主程序的斷點及現(xiàn)場信息,然后根據(jù)中斷源提供的信斷的主程序的斷點及現(xiàn)場信息,然后根據(jù)中斷源提供的信息,找到中斷服務子程序的入口地址,轉(zhuǎn)去執(zhí)行新的程序息,找到中斷服務子程序的入口地址,轉(zhuǎn)去執(zhí)行新的程序段,這就是中斷響應。段,這就是中斷響應。 v CPU響應中斷是有條件的,如內(nèi)部允許中斷、中斷未被屏響應中斷是有條件的,如內(nèi)部允許中斷、中斷未被屏蔽、當前指令執(zhí)行
55、完等。蔽、當前指令執(zhí)行完等。CPU響應中斷以后,就會中止當響應中斷以后,就會中止當前的程序,轉(zhuǎn)去執(zhí)行一個中斷服務子程序,以完成為相應前的程序,轉(zhuǎn)去執(zhí)行一個中斷服務子程序,以完成為相應設(shè)備的服務。設(shè)備的服務。設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口v 3直接訪問內(nèi)存直接訪問內(nèi)存DMA方式方式v 利用中斷,系統(tǒng)和設(shè)備之間可以通過設(shè)備驅(qū)動程序傳送數(shù)據(jù),但是,利用中斷,系統(tǒng)和設(shè)備之間可以通過設(shè)備驅(qū)動程序傳送數(shù)據(jù),但是,當傳送的數(shù)據(jù)量很大時,因為中斷處理上的延遲,利用中斷方式的效當傳送的數(shù)據(jù)量很大時,因為中斷處理上的延遲,利用中斷方式的效率會大大降低。率會大大降低。v 而而DMA可以解決這一問題??梢越鉀Q這一問
56、題。DMA可允許設(shè)備和系統(tǒng)內(nèi)存間在沒有處可允許設(shè)備和系統(tǒng)內(nèi)存間在沒有處理器參與的情況下傳輸大量數(shù)據(jù)。設(shè)備驅(qū)動程序在利用理器參與的情況下傳輸大量數(shù)據(jù)。設(shè)備驅(qū)動程序在利用DMA之前,之前,需要選擇需要選擇DMA通道并定義相關(guān)寄存器,以及數(shù)據(jù)的傳輸方向,即讀通道并定義相關(guān)寄存器,以及數(shù)據(jù)的傳輸方向,即讀取或?qū)懭耄缓髮⒃O(shè)備設(shè)定為利用該取或?qū)懭?,然后將設(shè)備設(shè)定為利用該DMA通道傳輸數(shù)據(jù)。通道傳輸數(shù)據(jù)。v 設(shè)備完成設(shè)置之后,可立即利用該設(shè)備完成設(shè)置之后,可立即利用該DMA通道在設(shè)備和系統(tǒng)的內(nèi)存之通道在設(shè)備和系統(tǒng)的內(nèi)存之間傳輸數(shù)據(jù),傳輸完畢后產(chǎn)生中斷以便通知驅(qū)動程序進行后續(xù)處理。間傳輸數(shù)據(jù),傳輸完畢后產(chǎn)生
57、中斷以便通知驅(qū)動程序進行后續(xù)處理。在利用在利用DMA進行數(shù)據(jù)傳輸?shù)耐瑫r,處理器仍然可以繼續(xù)執(zhí)行指令。進行數(shù)據(jù)傳輸?shù)耐瑫r,處理器仍然可以繼續(xù)執(zhí)行指令。 linux設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程v 設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程v 設(shè)備驅(qū)動程序和應用程序區(qū)別如下:應用程序一般有一個設(shè)備驅(qū)動程序和應用程序區(qū)別如下:應用程序一般有一個 main 函數(shù),從頭到尾執(zhí)行一個任務;驅(qū)動程序卻不同,函數(shù),從頭到尾執(zhí)行一個任務;驅(qū)動程序卻不同,它沒有它沒有 main函數(shù),通過使用宏函數(shù),通過使用宏 module_init(初始化函數(shù)初始化函數(shù)名名); 將初始化函數(shù)加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)將初始化函數(shù)
58、加入內(nèi)核全局初始化函數(shù)列表中,在內(nèi)核初始化時執(zhí)行驅(qū)動的初始化函數(shù),從而完成驅(qū)動的初始核初始化時執(zhí)行驅(qū)動的初始化函數(shù),從而完成驅(qū)動的初始化和注冊,之后驅(qū)動便停止等待被應用軟件調(diào)用。驅(qū)動程化和注冊,之后驅(qū)動便停止等待被應用軟件調(diào)用。驅(qū)動程序中有一個宏序中有一個宏 moudule_exit(退出處理函數(shù)名退出處理函數(shù)名)注冊退出處注冊退出處理函數(shù)。它在驅(qū)動退出時被調(diào)用。理函數(shù)。它在驅(qū)動退出時被調(diào)用。linux設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程v 設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程 1. 編寫驅(qū)動源碼編寫驅(qū)動源碼 2. 編寫編寫Makefile文件文件 3. 編譯驅(qū)動模塊編譯驅(qū)動模塊 4. 加載驅(qū)動模塊加
59、載驅(qū)動模塊 5. 驅(qū)動程序框架驅(qū)動程序框架linux設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程v 1. 編寫驅(qū)動源碼編寫驅(qū)動源碼/ hello.c#include #include #include static int _init hello_init(void)printk(KERN_ALERT Hello World!n);return 0;static void _exit hello_exit(void) printk(KERN_ALERT Goodbye World!n);module_init(hello_init);module_exit(hello_exit);MODULE_LICEN
60、SE(GPL);linux設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程v 2. 編寫編寫Makefile文件文件v 針對以上源碼寫一個針對以上源碼寫一個Makefile文件用來編譯它,文件用來編譯它,Makefile和和hello.c文件保存在同一個目錄下。文件保存在同一個目錄下。Makefile文件的內(nèi)容文件的內(nèi)容可以簡單編寫如下內(nèi)容:可以簡單編寫如下內(nèi)容:#Makefile#obj-m:=hello.o linux設(shè)備驅(qū)動開發(fā)流程設(shè)備驅(qū)動開發(fā)流程v 3. 編譯驅(qū)動模塊編譯驅(qū)動模塊make -C /usr/src/kernels/2.6.29.4-167.fc11.i686.PAE/ M=$(pwd)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地下室裝修合同范例
- 券商產(chǎn)品合同范本
- 土地評估與咨詢服務合同范文2025版
- 印象合同范本
- 參與合同范本
- 書設(shè)計 合同范例
- 合同變更與補充合同范本
- 2025年住宅小區(qū)物業(yè)管理合同規(guī)范
- 買賣種子合同范本
- 四川省買賣賒賬合同范本5篇
- 低空經(jīng)濟產(chǎn)業(yè)示范區(qū)建設(shè)實施路徑
- 常見隔離手術(shù)
- 第47屆世界技能大賽江蘇省選拔賽網(wǎng)絡安全項目技術(shù)工作文件
- 2024中華人民共和國文物保護法詳細解讀課件
- B細胞靶向藥物治療風濕免疫病中國專家共識(2024版)
- 職業(yè)教育培訓項目建設(shè)內(nèi)容
- 手機租賃合同模板
- 成人禮快閃開場相冊演示模板
- 國家職業(yè)技術(shù)技能標準 5-04-01-01 淡水水生動物苗種繁育工 人社廳發(fā)20155號
- 現(xiàn)代家政導論-課件 4.1.2認識國外家政教育發(fā)展
- 項目式教學在小學數(shù)學教學中的應用
評論
0/150
提交評論