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

正文內(nèi)容

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

2025-03-10 11:44 本頁(yè)面
 

【正文】 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ū)動(dòng)程序開(kāi)發(fā)2TM 2ARM及 Thumb指令集n 設(shè)備驅(qū)動(dòng)可以理解為操作系統(tǒng)的一部分,對(duì)于一個(gè)特定的硬設(shè)備驅(qū)動(dòng)可以理解為操作系統(tǒng)的一部分,對(duì)于一個(gè)特定的硬件設(shè)備來(lái)說(shuō),其對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序是不同的。比如網(wǎng)卡、件設(shè)備來(lái)說(shuō),其對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序是不同的。比如網(wǎng)卡、聲卡、鍵盤(pán)、鼠標(biāo)、顯卡等。聲卡、鍵盤(pán)、鼠標(biāo)、顯卡等。n 對(duì)于操作系統(tǒng)來(lái)說(shuō),掛接的設(shè)備越多,所需要的設(shè)備驅(qū)動(dòng)程對(duì)于操作系統(tǒng)來(lái)說(shuō),掛接的設(shè)備越多,所需要的設(shè)備驅(qū)動(dòng)程序也越多。操作系統(tǒng)本身并沒(méi)有對(duì)種類繁多的硬件設(shè)備提供序也越多。操作系統(tǒng)本身并沒(méi)有對(duì)種類繁多的硬件設(shè)備提供持久不變的持久不變的 “設(shè)備驅(qū)動(dòng)設(shè)備驅(qū)動(dòng) ”, 也就是說(shuō)操作系統(tǒng)在沒(méi)有設(shè)備驅(qū)動(dòng)也就是說(shuō)操作系統(tǒng)在沒(méi)有設(shè)備驅(qū)動(dòng)程序支持下是無(wú)法正常支配硬件行為的。程序支持下是無(wú)法正常支配硬件行為的。n 這個(gè)時(shí)候就需要獨(dú)立開(kāi)發(fā)一套適合自己產(chǎn)品的設(shè)備驅(qū)動(dòng)。正這個(gè)時(shí)候就需要獨(dú)立開(kāi)發(fā)一套適合自己產(chǎn)品的設(shè)備驅(qū)動(dòng)。正是操作系統(tǒng)留下了是操作系統(tǒng)留下了 擴(kuò)展設(shè)備驅(qū)動(dòng)的接口擴(kuò)展設(shè)備驅(qū)動(dòng)的接口 ,才有了現(xiàn)在支持各,才有了現(xiàn)在支持各種應(yīng)用場(chǎng)合的硬件設(shè)備的蓬勃發(fā)展。種應(yīng)用場(chǎng)合的硬件設(shè)備的蓬勃發(fā)展。n 對(duì)于嵌入式開(kāi)發(fā),更沒(méi)有通用的驅(qū)動(dòng)程序可以便用。因此,對(duì)于嵌入式開(kāi)發(fā),更沒(méi)有通用的驅(qū)動(dòng)程序可以便用。因此,驅(qū)動(dòng)程序開(kāi)發(fā)是整個(gè)嵌入式系統(tǒng)設(shè)計(jì)過(guò)程中必不可少的一部驅(qū)動(dòng)程序開(kāi)發(fā)是整個(gè)嵌入式系統(tǒng)設(shè)計(jì)過(guò)程中必不可少的一部分。分。3TM 3ARM及 Thumb指令集n n 設(shè)備驅(qū)動(dòng)程序是設(shè)備驅(qū)動(dòng)程序是 Linux內(nèi)核的重要組成部分。像操作系統(tǒng)的內(nèi)核的重要組成部分。像操作系統(tǒng)的其他部分一樣,其他部分一樣, 驅(qū)動(dòng)程序在一個(gè)高優(yōu)先級(jí)的環(huán)境下工作驅(qū)動(dòng)程序在一個(gè)高優(yōu)先級(jí)的環(huán)境下工作 ,如,如果發(fā)生錯(cuò)誤則可能會(huì)引發(fā)嚴(yán)重的問(wèn)題。設(shè)備驅(qū)動(dòng)程序控制了果發(fā)生錯(cuò)誤則可能會(huì)引發(fā)嚴(yán)重的問(wèn)題。設(shè)備驅(qū)動(dòng)程序控制了操作系統(tǒng)和硬件設(shè)備之間的交互操作系統(tǒng)和硬件設(shè)備之間的交互 ,完成以下功能:,完成以下功能:n 對(duì)設(shè)備對(duì)設(shè)備 初始化初始化 和和 釋放釋放 ;;n 對(duì)設(shè)備進(jìn)行對(duì)設(shè)備進(jìn)行 管理管理 ,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的 操操作接口作接口 ;;n 讀取讀取 應(yīng)用程序傳送給設(shè)備文件的應(yīng)用程序傳送給設(shè)備文件的 數(shù)據(jù)數(shù)據(jù) 或者或者 回送回送 應(yīng)用程序請(qǐng)求應(yīng)用程序請(qǐng)求的的 數(shù)據(jù)數(shù)據(jù) ;;n 檢測(cè)和處理設(shè)備出現(xiàn)的檢測(cè)和處理設(shè)備出現(xiàn)的 錯(cuò)誤錯(cuò)誤 。4TM 4ARM及 Thumb指令集應(yīng)用程序應(yīng)用程序硬件層硬件層驅(qū)動(dòng)程序驅(qū)動(dòng)程序文件系統(tǒng)文件系統(tǒng)整個(gè)設(shè)備管理子系統(tǒng)的結(jié)構(gòu)如圖 所示。5TM 5ARM及 Thumb指令集n 2.. Linux設(shè)備驅(qū)動(dòng)程序接口設(shè)備驅(qū)動(dòng)程序接口n 系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的接口,驅(qū)動(dòng)程序系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核與應(yīng)用程序之間的接口,驅(qū)動(dòng)程序則是操作系統(tǒng)內(nèi)核與機(jī)器硬件的接口。則是操作系統(tǒng)內(nèi)核與機(jī)器硬件的接口。 設(shè)備驅(qū)動(dòng)程序能夠直設(shè)備驅(qū)動(dòng)程序能夠直接訪問(wèn)硬件的代碼,必須為應(yīng)用程序提供系統(tǒng)調(diào)用。接訪問(wèn)硬件的代碼,必須為應(yīng)用程序提供系統(tǒng)調(diào)用。 以便應(yīng)以便應(yīng)用程序能訪問(wèn)設(shè)備。用程序能訪問(wèn)設(shè)備。n 在在 LINUX中,主要有三種設(shè)備即:中,主要有三種設(shè)備即: 字符設(shè)備字符設(shè)備 .塊設(shè)備和網(wǎng)絡(luò)塊設(shè)備和網(wǎng)絡(luò)設(shè)備設(shè)備 ,與此相關(guān)主要有三類設(shè)備驅(qū)動(dòng)程序,字符設(shè)備驅(qū)動(dòng)程,與此相關(guān)主要有三類設(shè)備驅(qū)動(dòng)程序,字符設(shè)備驅(qū)動(dòng)程序,塊設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序序,塊設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序 .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è)備 就像使用就像使用 讀寫(xiě)普通的讀寫(xiě)普通的文件一樣文件一樣 方便方便 ,使用相同的使用相同的 open(),close(),read(),write()等等 ,真真正做到了與設(shè)備無(wú)關(guān)。正做到了與設(shè)備無(wú)關(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一個(gè)運(yùn)行的一個(gè)運(yùn)行的 linux系統(tǒng),當(dāng)前使用的設(shè)備可以通過(guò)文件系統(tǒng),當(dāng)前使用的設(shè)備可以通過(guò)文件/proc/devices查看。查看。 7TM 7ARM及 Thumb指令集驅(qū)動(dòng)程序中涉及的幾個(gè)概念模塊的概念模塊的概念n Linux可以以可以以 模塊模塊 的形式的形式 加載設(shè)備加載設(shè)備 類型,通常來(lái)說(shuō)類型,通常來(lái)說(shuō) 一個(gè)模一個(gè)模塊對(duì)應(yīng)實(shí)現(xiàn)一個(gè)設(shè)備驅(qū)動(dòng)塊對(duì)應(yīng)實(shí)現(xiàn)一個(gè)設(shè)備驅(qū)動(dòng) ,因此是可以分類的。一般一個(gè),因此是可以分類的。一般一個(gè)設(shè)備驅(qū)動(dòng)對(duì)應(yīng)一類設(shè)備的模塊方式,這樣便于多個(gè)設(shè)備的設(shè)備驅(qū)動(dòng)對(duì)應(yīng)一類設(shè)備的模塊方式,這樣便于多個(gè)設(shè)備的協(xié)調(diào)工作也利于應(yīng)用程序的開(kāi)發(fā)和擴(kuò)展。協(xié)調(diào)工作也利于應(yīng)用程序的開(kāi)發(fā)和擴(kuò)展。n Linux的驅(qū)動(dòng)開(kāi)發(fā)調(diào)試有兩種方法:的驅(qū)動(dòng)開(kāi)發(fā)調(diào)試有兩種方法:n (( 1)直接編譯到內(nèi)核,再運(yùn)行新的內(nèi)核來(lái)測(cè)試;)直接編譯到內(nèi)核,再運(yùn)行新的內(nèi)核來(lái)測(cè)試;n (( 2)編譯為模塊的形式,單獨(dú)加載運(yùn)行調(diào)試。)編譯為模塊的形式,單獨(dú)加載運(yùn)行調(diào)試。 n 通常情況下設(shè)備驅(qū)動(dòng)的通常情況下設(shè)備驅(qū)動(dòng)的 模塊動(dòng)態(tài)加載模塊動(dòng)態(tài)加載 更為普遍,開(kāi)發(fā)人員更為普遍,開(kāi)發(fā)人員不必在調(diào)試過(guò)程中頻繁啟動(dòng)機(jī)器就能完成設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)不必在調(diào)試過(guò)程中頻繁啟動(dòng)機(jī)器就能完成設(shè)備驅(qū)動(dòng)的開(kāi)發(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命令來(lái)卸載,這兩個(gè)命命令來(lái)卸載,這兩個(gè)命令分別調(diào)用令分別調(diào)用 module_init()和和 module_exit ()函數(shù),還可以用函數(shù),還可以用lsmod命令來(lái)查看所有已加載的模塊的狀態(tài)。命令來(lái)查看所有已加載的模塊的狀態(tài)。 n Linux中模塊可以用中模塊可以用 C語(yǔ)言編寫(xiě),用語(yǔ)言編寫(xiě),用 gcc命令命令 編譯成模塊編譯成模塊 *.ko9TM 9ARM及 Thumb指令集編寫(xiě) 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)核特殊宏 ,分別用來(lái)定義模分別用來(lái)定義模塊被裝載和卸載時(shí)調(diào)用的函數(shù)塊被裝載和卸載時(shí)調(diào)用的函數(shù)定義定義 printk()中相關(guān)的宏中相關(guān)的宏 ,比比如如 KERN_ALERT10TM 10ARM及 Thumb指令集編寫(xiě) 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)核中 ,他類似于標(biāo)準(zhǔn)他類似于標(biāo)準(zhǔn) C函數(shù)函數(shù) printf().用用 MODULE_LICENSE宏來(lái)宏來(lái)聲明該模塊的許可協(xié)議聲明該模塊的許可協(xié)議 ,聲明為聲明為BSD和和 GPL雙重協(xié)議許可雙重協(xié)議許可11TM 11ARM及 Thumb指令集編寫(xiě) Hello World 模塊n MODULE_AUTHOR(“BENSON”)。//可選的可選的n MODULE_DESCRIPTION(STUDY_MODULE)。//可選的可選的12TM 12ARM及 Thumb指令集Printk函數(shù)函數(shù)n printk(KERN_ALERTHello,World !\n)。n 問(wèn)問(wèn) :為什么不用為什么不用 printf()函數(shù)呢函數(shù)呢 ?n 答答 :在講交叉編譯工具鏈的時(shí)候在講交叉編譯工具鏈的時(shí)候 ,曾經(jīng)講到在曾經(jīng)講到在 編譯內(nèi)核的時(shí)候編譯內(nèi)核的時(shí)候不能使用標(biāo)準(zhǔn)的不能使用標(biāo)準(zhǔn)的 C庫(kù)和其他函數(shù)庫(kù)的支持庫(kù)和其他函數(shù)庫(kù)的支持 ,所以不能使用所以不能使用printf()庫(kù)函數(shù)庫(kù)函數(shù)n 內(nèi)核有自己的打印函數(shù)內(nèi)核有自己的打印函數(shù) printk(),它通過(guò)自身的運(yùn)行而不需要它通過(guò)自身的運(yùn)行而不需要C庫(kù)的幫助庫(kù)的幫助 .在使用在使用 insmod裝載之后裝載之后 ,內(nèi)核與內(nèi)核公共函數(shù)和內(nèi)核與內(nèi)核公共函數(shù)和變量進(jìn)行連接變量進(jìn)行連接 ,從而可以使用從而可以使用 printk()函數(shù)函數(shù) .n 其中其中 KERN_ALERT宏是標(biāo)記宏是標(biāo)記 printk()打印出字符的打印出字符的 優(yōu)先等級(jí)優(yōu)先等級(jí)的的 ,通常有八種消息級(jí)別通常有八種消息級(jí)別 ,定義在定義在 include/linux/中中 .13TM 13ARM及 Thumb指令集n printk(日志級(jí)別日志級(jí)別 “消息文本消息文本 ”);;n 這里的日志級(jí)別通俗的說(shuō)指的是對(duì)這里的日志級(jí)別通俗的說(shuō)指的是對(duì) 文本信息的一種輸出范圍上的指定文本信息的一種輸出范圍上的指定 。n defineKERN_EMERG0/*緊急事件消息,系統(tǒng)崩潰之前提示,表緊急事件消息,系統(tǒng)崩潰之前提示,表示系統(tǒng)不可用示系統(tǒng)不可用 */n defineKERN_ALERT1/*報(bào)告消息,表示必須立即采取措施報(bào)告消息,表示必須立即采取措施 */n defineKERN_CRIT2/*臨界條件,通常涉及嚴(yán)重的硬件或軟件操作臨界條件,通常涉及嚴(yán)重的硬件或軟件操作失敗失敗 */n defineKERN_ERR3/*錯(cuò)誤條件,驅(qū)動(dòng)程序常用錯(cuò)誤條件,驅(qū)動(dòng)程序常用 KERN_ERR來(lái)報(bào)來(lái)報(bào)告硬件的錯(cuò)誤告硬件的錯(cuò)誤 */n defineKERN_WARNING4/* 警告條件,對(duì)可能出現(xiàn)問(wèn)題的情況進(jìn)警告條件,對(duì)可能出現(xiàn)問(wèn)題的情況進(jìn)行警告行警告 */n defineKERN_NOTICE5/*正常但又重要的條件,用于提醒。常用正常但又重要的條件,用于提醒。常用于與安全相關(guān)的消息于與安全相關(guān)的消息 */n defineKERN_INFO6/*提示信息,如驅(qū)動(dòng)程序啟動(dòng)時(shí),打印硬件信提示信息,如驅(qū)動(dòng)程序啟動(dòng)時(shí),打印硬件信息息 */n defineKERN_DEBUG7/*調(diào)試級(jí)別的消息調(diào)試級(jí)別的消息 */14TM 14ARM及 Thumb指令集 編寫(xiě) 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$:表示完整的目標(biāo)文件表示完整的目標(biāo)文件 ,包括包括擴(kuò)展名擴(kuò)展名$:比目標(biāo)文件更新的依賴文比目標(biāo)文件更新的依賴文件件$^:表示所有的依賴文件表示所有的依賴文件最后生成最后生成 和和 hello用來(lái)指定編譯內(nèi)核時(shí)所用的用來(lái)指定編譯內(nèi)核時(shí)所用的編譯選項(xiàng)編譯選項(xiàng)15TM 15ARM及 Thumb指令集 編寫(xiě) 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
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
公安備案圖鄂ICP備17016276號(hào)-1