驅(qū)動(dòng)程序本身就是內(nèi)核的一部分,從www.kernel.org下載回來的內(nèi)核代碼,單從代碼量來說驅(qū)動(dòng)程序超過占65%,當(dāng)然因?yàn)閮?nèi)核配置和條件編譯的關(guān)系,并不是所有的驅(qū)動(dòng)都會(huì)被選上。內(nèi)核中除掉驅(qū)動(dòng)程序以外的代碼是一個(gè)框架,該框架提供一個(gè)公有的屬性,不隨CPU體系架構(gòu)和具體硬件型號(hào)而變化,也是一個(gè)高度抽象模塊集,更是內(nèi)核的“基礎(chǔ)設(shè)施”,這個(gè)基礎(chǔ)設(shè)施向驅(qū)動(dòng)程序提供一些接口和定義一些標(biāo)準(zhǔn)。驅(qū)動(dòng)程序的設(shè)計(jì)要遵循內(nèi)核給定給驅(qū)動(dòng)程序的標(biāo)準(zhǔn)并使用內(nèi)核和接口,這樣就把操作具體硬件相關(guān)的工作交給了驅(qū)動(dòng)程序,抽象出更一般的模塊,提高了操作系統(tǒng)的可移植性,可擴(kuò)展性,和標(biāo)準(zhǔn)化。就像做填空題那樣,驅(qū)動(dòng)程序在內(nèi)核給定的空格上填好這個(gè)固定的空以使整個(gè)表達(dá)式是正確的。嚴(yán)格來說驅(qū)動(dòng)程序包括:CPU體系架構(gòu)驅(qū)動(dòng),各種各樣的硬件設(shè)施驅(qū)動(dòng)。一般的驅(qū)動(dòng)開發(fā)者其實(shí)工作的重點(diǎn)是除CPU外的設(shè)備的適配;贑PU體系架構(gòu)的實(shí)現(xiàn)依賴于具體的平臺(tái)如ARM,X86,SPARC,PPC,MIPS等,所以具體到平臺(tái)的實(shí)現(xiàn)部分有些是用匯編語言寫的,這些匯編因不同的體系結(jié)構(gòu)而不同(某種原因是C語言實(shí)現(xiàn)不了的操作,某些是基于采用匯編實(shí)現(xiàn)效率更高更安全)。比如在關(guān)中斷開斷的實(shí)現(xiàn)又或切換進(jìn)程上下文等操作采用匯編。除CPU外的設(shè)備一般C語言就完成了,因?yàn)榇蠖鄶?shù)是與操作寄存器和數(shù)據(jù)讀寫有關(guān)。這里應(yīng)該指明,現(xiàn)在的嵌入式芯片應(yīng)該稱之為SOC(System On Chip)更適合,而本文的CPU指的是處理器內(nèi)核比如ARM926EJ-S。設(shè)備驅(qū)動(dòng)程序是跟設(shè)備操作相關(guān)的系統(tǒng)調(diào)用的內(nèi)核實(shí)現(xiàn)版本。就是說對(duì)設(shè)備的操作(比如ioctl(fd,…))其在內(nèi)核的實(shí)現(xiàn)是由驅(qū)動(dòng)完成。所以驅(qū)動(dòng)要做的事情就是實(shí)現(xiàn)file_operations結(jié)構(gòu)的函數(shù)指針,安排中斷例程。當(dāng)然驅(qū)動(dòng)也有分層的,有些模塊純粹是一種軟件抽象。比如USB驅(qū)動(dòng)分層。驅(qū)動(dòng)程序是直接面對(duì)硬件,內(nèi)核通過驅(qū)動(dòng)與硬件交互。對(duì)內(nèi)核的核心來說驅(qū)動(dòng)屏蔽了硬件的實(shí)現(xiàn)細(xì)節(jié)。驅(qū)動(dòng)對(duì)硬件的操作集中表現(xiàn)在對(duì)寄存器的訪問及數(shù)據(jù)讀寫。