freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第七章linux設(shè)備驅(qū)動程序開發(fā)(已修改)

2025-03-10 11:44 本頁面
 

【正文】 1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D第七章 linux設(shè)備驅(qū)動程序開發(fā)2TM 2ARM及 Thumb指令集n 設(shè)備驅(qū)動可以理解為操作系統(tǒng)的一部分,對于一個特定的硬設(shè)備驅(qū)動可以理解為操作系統(tǒng)的一部分,對于一個特定的硬件設(shè)備來說,其對應(yīng)的設(shè)備驅(qū)動程序是不同的。比如網(wǎng)卡、件設(shè)備來說,其對應(yīng)的設(shè)備驅(qū)動程序是不同的。比如網(wǎng)卡、聲卡、鍵盤、鼠標、顯卡等。聲卡、鍵盤、鼠標、顯卡等。n 對于操作系統(tǒng)來說,掛接的設(shè)備越多,所需要的設(shè)備驅(qū)動程對于操作系統(tǒng)來說,掛接的設(shè)備越多,所需要的設(shè)備驅(qū)動程序也越多。操作系統(tǒng)本身并沒有對種類繁多的硬件設(shè)備提供序也越多。操作系統(tǒng)本身并沒有對種類繁多的硬件設(shè)備提供持久不變的持久不變的 “設(shè)備驅(qū)動設(shè)備驅(qū)動 ”, 也就是說操作系統(tǒng)在沒有設(shè)備驅(qū)動也就是說操作系統(tǒng)在沒有設(shè)備驅(qū)動程序支持下是無法正常支配硬件行為的。程序支持下是無法正常支配硬件行為的。n 這個時候就需要獨立開發(fā)一套適合自己產(chǎn)品的設(shè)備驅(qū)動。正這個時候就需要獨立開發(fā)一套適合自己產(chǎn)品的設(shè)備驅(qū)動。正是操作系統(tǒng)留下了是操作系統(tǒng)留下了 擴展設(shè)備驅(qū)動的接口擴展設(shè)備驅(qū)動的接口 ,才有了現(xiàn)在支持各,才有了現(xiàn)在支持各種應(yīng)用場合的硬件設(shè)備的蓬勃發(fā)展。種應(yīng)用場合的硬件設(shè)備的蓬勃發(fā)展。n 對于嵌入式開發(fā),更沒有通用的驅(qū)動程序可以便用。因此,對于嵌入式開發(fā),更沒有通用的驅(qū)動程序可以便用。因此,驅(qū)動程序開發(fā)是整個嵌入式系統(tǒng)設(shè)計過程中必不可少的一部驅(qū)動程序開發(fā)是整個嵌入式系統(tǒng)設(shè)計過程中必不可少的一部分。分。3TM 3ARM及 Thumb指令集n n 設(shè)備驅(qū)動程序是設(shè)備驅(qū)動程序是 Linux內(nèi)核的重要組成部分。像操作系統(tǒng)的內(nèi)核的重要組成部分。像操作系統(tǒng)的其他部分一樣,其他部分一樣, 驅(qū)動程序在一個高優(yōu)先級的環(huán)境下工作驅(qū)動程序在一個高優(yōu)先級的環(huán)境下工作 ,如,如果發(fā)生錯誤則可能會引發(fā)嚴重的問題。設(shè)備驅(qū)動程序控制了果發(fā)生錯誤則可能會引發(fā)嚴重的問題。設(shè)備驅(qū)動程序控制了操作系統(tǒng)和硬件設(shè)備之間的交互操作系統(tǒng)和硬件設(shè)備之間的交互 ,完成以下功能:,完成以下功能:n 對設(shè)備對設(shè)備 初始化初始化 和和 釋放釋放 ;;n 對設(shè)備進行對設(shè)備進行 管理管理 ,包括實時參數(shù)設(shè)置,以及提供對設(shè)備的,包括實時參數(shù)設(shè)置,以及提供對設(shè)備的 操操作接口作接口 ;;n 讀取讀取 應(yīng)用程序傳送給設(shè)備文件的應(yīng)用程序傳送給設(shè)備文件的 數(shù)據(jù)數(shù)據(jù) 或者或者 回送回送 應(yīng)用程序請求應(yīng)用程序請求的的 數(shù)據(jù)數(shù)據(jù) ;;n 檢測和處理設(shè)備出現(xiàn)的檢測和處理設(shè)備出現(xiàn)的 錯誤錯誤 。4TM 4ARM及 Thumb指令集應(yīng)用程序應(yīng)用程序硬件層硬件層驅(qū)動程序驅(qū)動程序文件系統(tǒng)文件系統(tǒng)整個設(shè)備管理子系統(tǒng)的結(jié)構(gòu)如圖 所示。5TM 5ARM及 Thumb指令集n 2.. Linux設(shè)備驅(qū)動程序接口設(shè)備驅(qū)動程序接口n 系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的接口,驅(qū)動程序系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的接口,驅(qū)動程序則是操作系統(tǒng)內(nèi)核與機器硬件的接口。則是操作系統(tǒng)內(nèi)核與機器硬件的接口。 設(shè)備驅(qū)動程序能夠直設(shè)備驅(qū)動程序能夠直接訪問硬件的代碼,必須為應(yīng)用程序提供系統(tǒng)調(diào)用。接訪問硬件的代碼,必須為應(yīng)用程序提供系統(tǒng)調(diào)用。 以便應(yīng)以便應(yīng)用程序能訪問設(shè)備。用程序能訪問設(shè)備。n 在在 LINUX中,主要有三種設(shè)備即:中,主要有三種設(shè)備即: 字符設(shè)備字符設(shè)備 .塊設(shè)備和網(wǎng)絡(luò)塊設(shè)備和網(wǎng)絡(luò)設(shè)備設(shè)備 ,與此相關(guān)主要有三類設(shè)備驅(qū)動程序,字符設(shè)備驅(qū)動程,與此相關(guān)主要有三類設(shè)備驅(qū)動程序,字符設(shè)備驅(qū)動程序,塊設(shè)備驅(qū)動程序和網(wǎng)絡(luò)設(shè)備驅(qū)動程序序,塊設(shè)備驅(qū)動程序和網(wǎng)絡(luò)設(shè)備驅(qū)動程序 .n 他們的系統(tǒng)調(diào)用是一致的,他們的系統(tǒng)調(diào)用是一致的, 采用統(tǒng)一的接口采用統(tǒng)一的接口 (在數(shù)據(jù)結(jié)構(gòu)在數(shù)據(jù)結(jié)構(gòu)file_operations中中 )。應(yīng)用程序使用。應(yīng)用程序使用 設(shè)備設(shè)備 就像使用就像使用 讀寫普通的讀寫普通的文件一樣文件一樣 方便方便 ,使用相同的使用相同的 open(),close(),read(),write()等等 ,真真正做到了與設(shè)備無關(guān)。正做到了與設(shè)備無關(guān)。6TM 6ARM及 Thumb指令集 設(shè)備類型 nLinux中的設(shè)備可以分為三類:中的設(shè)備可以分為三類:n字符設(shè)備字符設(shè)備n塊設(shè)備塊設(shè)備n網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)設(shè)備n一個運行的一個運行的 linux系統(tǒng),當前使用的設(shè)備可以通過文件系統(tǒng),當前使用的設(shè)備可以通過文件/proc/devices查看。查看。 7TM 7ARM及 Thumb指令集驅(qū)動程序中涉及的幾個概念模塊的概念模塊的概念n Linux可以以可以以 模塊模塊 的形式的形式 加載設(shè)備加載設(shè)備 類型,通常來說類型,通常來說 一個模一個模塊對應(yīng)實現(xiàn)一個設(shè)備驅(qū)動塊對應(yīng)實現(xiàn)一個設(shè)備驅(qū)動 ,因此是可以分類的。一般一個,因此是可以分類的。一般一個設(shè)備驅(qū)動對應(yīng)一類設(shè)備的模塊方式,這樣便于多個設(shè)備的設(shè)備驅(qū)動對應(yīng)一類設(shè)備的模塊方式,這樣便于多個設(shè)備的協(xié)調(diào)工作也利于應(yīng)用程序的開發(fā)和擴展。協(xié)調(diào)工作也利于應(yīng)用程序的開發(fā)和擴展。n Linux的驅(qū)動開發(fā)調(diào)試有兩種方法:的驅(qū)動開發(fā)調(diào)試有兩種方法:n (( 1)直接編譯到內(nèi)核,再運行新的內(nèi)核來測試;)直接編譯到內(nèi)核,再運行新的內(nèi)核來測試;n (( 2)編譯為模塊的形式,單獨加載運行調(diào)試。)編譯為模塊的形式,單獨加載運行調(diào)試。 n 通常情況下設(shè)備驅(qū)動的通常情況下設(shè)備驅(qū)動的 模塊動態(tài)加載模塊動態(tài)加載 更為普遍,開發(fā)人員更為普遍,開發(fā)人員不必在調(diào)試過程中頻繁啟動機器就能完成設(shè)備驅(qū)動的開發(fā)不必在調(diào)試過程中頻繁啟動機器就能完成設(shè)備驅(qū)動的開發(fā)工作。工作。8TM 8ARM及 Thumb指令集n 模塊加載與卸載模塊加載與卸載 n 模塊方式調(diào)試:模塊方式調(diào)試:n (( 1)) 編譯的模塊直接插入內(nèi)核:用編譯的模塊直接插入內(nèi)核:用 insmod工具;工具;n (( 2)從內(nèi)核中卸載模塊:用)從內(nèi)核中卸載模塊:用 rmmodn 模塊用模塊用 insmod命令加載,用命令加載,用 rmmod命令來卸載,這兩個命命令來卸載,這兩個命令分別調(diào)用令分別調(diào)用 module_init()和和 module_exit ()函數(shù),還可以用函數(shù),還可以用lsmod命令來查看所有已加載的模塊的狀態(tài)。命令來查看所有已加載的模塊的狀態(tài)。 n Linux中模塊可以用中模塊可以用 C語言編寫,用語言編寫,用 gcc命令命令 編譯成模塊編譯成模塊 *.ko9TM 9ARM及 Thumb指令集編寫 Hello World 模塊n includelinux/n includelinux/n includelinux/n MODULE_LICENSE(DualBSD/GPL)。n staticint__inithello_init(void)n {n printk(KERN_ALERTHello,World !\n)。n return0。n }n staticvoid__exithello_exit(void)n {n printk(KERN_ALERTGoodbye,world!\n)。n }n module_init(hello_init)。n module_exit(hello_exit)。定義定義 __init、 __exit、module_init、 module_exit所必需的宏所必需的宏定義所有模塊相關(guān)的宏定義所有模塊相關(guān)的宏 ,比如比如MODULE_LICENSEmodule_init()、 module_exit()為內(nèi)核特殊宏為內(nèi)核特殊宏 ,分別用來定義模分別用來定義模塊被裝載和卸載時調(diào)用的函數(shù)塊被裝載和卸載時調(diào)用的函數(shù)定義定義 printk()中相關(guān)的宏中相關(guān)的宏 ,比比如如 KERN_ALERT10TM 10ARM及 Thumb指令集編寫 Hello World 模塊n includelinux/n includelinux/n includelinux/n MODULE_LICENSE(DualBSD/GPL)。n staticinthello_init(void)n {n printk(KERN_ALERTHello,World !\n)。n return0。n }n staticvoidhello_exit(void)n {n printk(KERN_ALERTGoodbye,world!\n)。n }n module_init(hello_init)。n module_exit(hello_exit)。內(nèi)核函數(shù)內(nèi)核函數(shù) printk被定義在被定義在linux內(nèi)核中內(nèi)核中 ,他類似于標準他類似于標準 C函數(shù)函數(shù) printf().用用 MODULE_LICENSE宏來宏來聲明該模塊的許可協(xié)議聲明該模塊的許可協(xié)議 ,聲明為聲明為BSD和和 GPL雙重協(xié)議許可雙重協(xié)議許可11TM 11ARM及 Thumb指令集編寫 Hello World 模塊n MODULE_AUTHOR(“BENSON”)。//可選的可選的n MODULE_DESCRIPTION(STUDY_MODULE)。//可選的可選的12TM 12ARM及 Thumb指令集Printk函數(shù)函數(shù)n printk(KERN_ALERTHello,World !\n)。n 問問 :為什么不用為什么不用 printf()函數(shù)呢函數(shù)呢 ?n 答答 :在講交叉編譯工具鏈的時候在講交叉編譯工具鏈的時候 ,曾經(jīng)講到在曾經(jīng)講到在 編譯內(nèi)核的時候編譯內(nèi)核的時候不能使用標準的不能使用標準的 C庫和其他函數(shù)庫的支持庫和其他函數(shù)庫的支持 ,所以不能使用所以不能使用printf()庫函數(shù)庫函數(shù)n 內(nèi)核有自己的打印函數(shù)內(nèi)核有自己的打印函數(shù) printk(),它通過自身的運行而不需要它通過自身的運行而不需要C庫的幫助庫的幫助 .在使用在使用 insmod裝載之后裝載之后 ,內(nèi)核與內(nèi)核公共函數(shù)和內(nèi)核與內(nèi)核公共函數(shù)和變量進行連接變量進行連接 ,從而可以使用從而可以使用 printk()函數(shù)函數(shù) .n 其中其中 KERN_ALERT宏是標記宏是標記 printk()打印出字符的打印出字符的 優(yōu)先等級優(yōu)先等級的的 ,通常有八種消息級別通常有八種消息級別 ,定義在定義在 include/linux/中中 .13TM 13ARM及 Thumb指令集n printk(日志級別日志級別 “消息文本消息文本 ”);;n 這里的日志級別通俗的說指的是對這里的日志級別通俗的說指的是對 文本信息的一種輸出范圍上的指定文本信息的一種輸出范圍上的指定 。n defineKERN_EMERG0/*緊急事件消息,系統(tǒng)崩潰之前提示,表緊急事件消息,系統(tǒng)崩潰之前提示,表示系統(tǒng)不可用示系統(tǒng)不可用 */n defineKERN_ALERT1/*報告消息,表示必須立即采取措施報告消息,表示必須立即采取措施 */n defineKERN_CRIT2/*臨界條件,通常涉及嚴重的硬件或軟件操作臨界條件,通常涉及嚴重的硬件或軟件操作失敗失敗 */n defineKERN_ERR3/*錯誤條件,驅(qū)動程序常用錯誤條件,驅(qū)動程序常用 KERN_ERR來報來報告硬件的錯誤告硬件的錯誤 */n defineKERN_WARNING4/* 警告條件,對可能出現(xiàn)問題的情況進警告條件,對可能出現(xiàn)問題的情況進行警告行警告 */n defineKERN_NOTICE5/*正常但又重要的條件,用于提醒。常用正常但又重要的條件,用于提醒。常用于與安全相關(guān)的消息于與安全相關(guān)的消息 */n defineKERN_INFO6/*提示信息,如驅(qū)動程序啟動時,打印硬件信提示信息,如驅(qū)動程序啟動時,打印硬件信息息 */n defineKERN_DEBUG7/*調(diào)試級別的消息調(diào)試級別的消息 */14TM 14ARM及 Thumb指令集 編寫 Hello World 模塊的 Makefilen EXEC=hellon OBJS=n SRC=n INCLUDE=/usr/src/linux/n CC=/usr/local/173。linux173。gccn LD=/usr/local/173。linux173。ldn MODCFLAGS=173。O2173。Wall 173。D__KERNEL__173。DMODULE173。I$(INCLUDE)n 173。march=armv4tn LDFLAGS=173。rn all:$(EXEC)n $(EXEC):$(OBJS)n $(LD)$(LDFLAGS)173。ohellon %. o:%.cn $(CC)$(MODCFLAGS)173。mapcs173。c$173。o$n clean:n 173。rm173。f$(EXEC)*.o*~core$:表示完整的目標文件表示完整的目標文件 ,包括包括擴展名擴展名$:比目標文件更新的依賴文比目標文件更新的依賴文件件$^:表示所有的依賴文件表示所有的依賴文件最后生成最后生成 和和 hello用來指定編譯內(nèi)核時所用的用來指定編譯內(nèi)核時所用的編譯選項編譯選項15TM 15ARM及 Thumb指令集 編寫 Hello World 模塊的 Makefilen P230n ifneq($(KERNELRELEASE),)n obj173。m:=n elsen KDIR=/lib/modules/173。ptx1/buildn PWD:=$(shell pwd)n default:n $(MAKE)173。C$(KDIR)M=$(PWD)modulesn Endif指定了指定了 內(nèi)核源代碼的位內(nèi)核源代碼的位置置 ,其中保存有內(nèi)核的,其中保存有內(nèi)核的頂層頂層 makefile文件文件 ob
點擊復(fù)制文檔內(nèi)容
教學課件相關(guān)推薦
文庫吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號-1