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