|
1 Linux 體系結(jié)構(gòu) 如下圖所示,Linux 體系結(jié)構(gòu),從大的方面可以分為用戶空間(User Space)和內(nèi)核空間(Kernel Space)。
用戶空間中包含了 C 庫,用戶的應(yīng)用程序。在某些體系結(jié)構(gòu)圖中還包含了 shell,當(dāng)然 shell 腳本也是Linux 體系中不可缺少的一部分。 內(nèi)核空間包括硬件平臺、平臺依賴代碼、內(nèi)核、系統(tǒng)調(diào)用接口。 在任何一個現(xiàn)代操作系統(tǒng)中,都是分層的。為什么需要分層呢? 從程序員的角度分析,將 linux 底層和和應(yīng)用分開,將 linux 底層和應(yīng)用分開,做應(yīng)用的做應(yīng)用,做底層的做底層,各干各的。經(jīng)濟學(xué)的基本原理是,分工產(chǎn)生效率。 從安全性的角度分析,是為了保護內(nèi)核。現(xiàn)代 CPU 通常都實現(xiàn)了不同的工作模式。 以 ARM 為例:ARM 實現(xiàn)了 7 種工作模式,不同模式下 CPU 可以執(zhí)行的指令或者訪問的寄存器不同: (1) 用戶模式 usr (2) 系統(tǒng)模式 sys (3) 管理模式 svc (4) 快速中斷 fiq (5) 外部中斷 irq (6) 數(shù)據(jù)訪問終止 abt (7) 未定義指令異常。 如果任何一個上層應(yīng)用都可以調(diào)用都可以調(diào)用寄存器,那樣肯定是無法穩(wěn)定執(zhí)行的。而且因為出現(xiàn)了這個問題,出現(xiàn)了一個新的學(xué)科“現(xiàn)代操作系統(tǒng)”,如果大家感興趣可以看一下“現(xiàn)代操作系統(tǒng)”相關(guān)文章或者書籍。 以 X86 為例:X86 實現(xiàn)了 4 個不同級別的權(quán)限,Ring0—Ring3 ;Ring0 下可以執(zhí)行特權(quán)指令,可以訪問 IO 設(shè)備;Ring3 則有很多的限制 如果分析一下 Android 的,這方面做的更加“喪心病狂”,Android 所有的 APK 應(yīng)用程序,都是在 Java虛擬機上面運行,應(yīng)用程序更加遠離底層。 另外,用戶空間和內(nèi)核空間是程序執(zhí)行的兩種不同狀態(tài),可以通過“系統(tǒng)調(diào)用”和“硬件中斷”來完成用戶空間到內(nèi)核空間的轉(zhuǎn)移。 2 Linux 內(nèi)核結(jié)構(gòu) 這一節(jié),分析一下內(nèi)核結(jié)構(gòu)。如下圖所示,是 Linux 內(nèi)核結(jié)構(gòu)圖。
SCI 層(System Call Interface),這一層是給應(yīng)用用戶空間提供一套標(biāo)準(zhǔn)的系統(tǒng)調(diào)用函數(shù)來訪問 Linux。前面分析 Linux 體系結(jié)構(gòu)的時候,介紹過任何一類現(xiàn)代操作系統(tǒng)都不會允許上層應(yīng)用直接訪問底層,在Linux 中,內(nèi)核提供了一套標(biāo)準(zhǔn)接口,上層應(yīng)用就可以通過這一套標(biāo)準(zhǔn)接口來訪問底層。 PM(Procees Management),這一部分包括具體創(chuàng)建創(chuàng)建進程(fork、exec),停止進程(kill、exit), 并控制他們之間的通信(signal 等)。還包括進程度,控制活動進程如何共享 CPU。這一部分是 Linux 已經(jīng)做好的,在寫驅(qū)動的時候,只需要調(diào)用對應(yīng)的函數(shù)即可實現(xiàn)這些功能,例如創(chuàng)建進程、進程通信等等。 MM(Memory Management),內(nèi)存管理的主要作用是控制多個進程安全的共享內(nèi)存區(qū)域。 VFS(Virtual File Systems),虛擬文件系統(tǒng),隱藏各種文件系統(tǒng)的具體細節(jié),為文件操作提供統(tǒng)一的接口。在 Linux 中“一切皆文件”,這些文件就是通過 VFS 來實現(xiàn)的。Linux 提供了一個大的通用模型,使這個模型包含了所有文件系統(tǒng)功能的集合。如下圖所示,是一個虛擬文件系統(tǒng)的結(jié)構(gòu)圖。
Device Drivers 設(shè)備驅(qū)動,這一部分就是需要學(xué)習(xí)和掌握的。Linux 內(nèi)核中有大量的代碼在設(shè)備驅(qū)動程序部分,用于控制特定的硬件設(shè)備。 Linux 驅(qū)動一般分為網(wǎng)絡(luò)設(shè)備、塊設(shè)備、字符設(shè)備、雜項設(shè)備,需要編寫的只有字符設(shè)備,雜項設(shè)備是不容易歸類的一種驅(qū)動,雜項設(shè)備和字符設(shè)備有很多重合的地方。 網(wǎng)絡(luò)協(xié)議棧,Linux 內(nèi)核中提供了豐富的網(wǎng)絡(luò)協(xié)議實現(xiàn)。 3 Linux 內(nèi)核源碼目錄結(jié)構(gòu) Linux 內(nèi)核源碼采用樹形結(jié)構(gòu)。功能相關(guān)的文件放到不同的子目錄下面,使程序更具有可讀行。使用Source Insight 打開源碼,如下圖所示,可以看到源碼是樹形結(jié)構(gòu)。
下面來介紹每一個目錄的作用。 arch 目錄是平臺目錄。處理器原廠提供一套 Linux 內(nèi)核的源碼,那么在這個目錄下都有一套針對具體處理器 CPU 的子目錄。每個 CPU 的子目錄,又進一步分解為 boot,mm, kernel 等子目錄,分別控制系統(tǒng)引導(dǎo),內(nèi)存管理,系統(tǒng)調(diào)用,動態(tài)調(diào)頻,主頻率設(shè)置部分等。 在 arch 目錄中有關(guān)鍵的平臺文件。任何一款支持 Linux 的處理器,都有一部分內(nèi)核代碼是針對特定的處理器來提供的,具體的實現(xiàn)就是通過平臺文件。 迅為 iTOP-4412 的平臺文件,是 arch→arm→mach-exynos→mach-itop4412.c。 arch→arm→boot 目錄,默認編譯生成的內(nèi)核鏡像是在這個目錄下。 在 arch→arm→kernel 目錄中,有針對具體 CPU 處理器的代碼,有相關(guān)內(nèi)核特性實現(xiàn)方式,如信號處理等。這一部分當(dāng)然是芯片廠商做好了,4412 的這部分就是三星已經(jīng)做好的部分。 在 arch→arm→lib 目錄 中,有 一些和 硬件相 關(guān)庫函 數(shù),后 面學(xué)習(xí) 驅(qū)動的 時候會 使用到 。在 arch→arm→tools 目錄中,包含了生成鏡像的工具。
如下圖所示。 在 binary 目錄中,有一些無源碼的驅(qū)動以二進制放到該文件夾,例如一些測試版本或者不愿意公布源碼,都可以將二進制文件放到這個目錄中。 在 drivers 目錄中,就是需要重點學(xué)習(xí)的部分,后面的實驗都是圍繞這一步進行的。 在 include 目錄中,通用的 Linux 頭文件都在該文件下。
如下圖所示,部分目錄如下。下面的這些目錄,幾乎不需要去動其中任何一個文件。
如下圖所示,有內(nèi)核編程的范例,實現(xiàn)安全性的代碼,聲卡設(shè)備驅(qū)動等還有內(nèi)核裁減配置工具目錄 tools,這一部分實現(xiàn)的功能是將.c 編譯成目標(biāo)文件,連接合并成可運行的內(nèi)核鏡像文件等。提供給大家的內(nèi)核源碼一百多 M,最后編譯成的 zImage 只有不到 5M,這都是依靠這個工具來實現(xiàn)的,后面會有針對性的實驗來教大家如何使用編譯工具。
|