Linux內(nèi)核分析(一)簡介和內(nèi)核配置編譯安裝
一、Linux體系結(jié)構(gòu)簡介
1.?Linux體系結(jié)構(gòu)(linux系統(tǒng)構(gòu)成)
Linux可以分為兩部分,分別為用戶空間和內(nèi)核空間具體如下圖:

a)?用戶空間包括:用戶的應(yīng)用程序、C庫
b)?內(nèi)核空間包括:系統(tǒng)調(diào)用接口、內(nèi)核(狹義內(nèi)核)、平臺架構(gòu)相關(guān)的代碼
2.?為什么要分為內(nèi)核空間和用戶空間
我們在分析u-boot的時候就說到過,我們的cpu在不同的工作模式下可以訪問的寄存器是不一樣的,所以為了保護(hù)我們的操作系統(tǒng),避免用戶程序?qū)?nèi)核搞崩,所以進(jìn)行了內(nèi)核空間和用戶空間的劃分。
a)?Arm處理器工作模式劃分:usr、FIQ、IRQ、svc、abt、und、sys(具體介紹在http://www.cnblogs.com/wrjvszq/p/4199682.html)
b)?X86處理器工作模式劃分:Ring0—Ring3,Ring0下可以執(zhí)行特權(quán)指令,可以訪問IO設(shè)備,Ring3則有很多的限制
注:我們可以通過系統(tǒng)調(diào)用和硬件中斷來完成用戶空間到內(nèi)核空間的轉(zhuǎn)移
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!


3.?Linux內(nèi)核結(jié)構(gòu)(廣義內(nèi)核)
Linux內(nèi)核由七個部分構(gòu)成,具體如下圖:

a)?系統(tǒng)調(diào)用接口(SCI):open、read、write等系統(tǒng)調(diào)用
b)?進(jìn)程管理(PM):創(chuàng)建進(jìn)程、刪除進(jìn)程、調(diào)度進(jìn)程等
c)?內(nèi)存管理(MM):內(nèi)存分配、管理等
d)?虛擬文件系統(tǒng)(VFS):為多種文件系統(tǒng)提供統(tǒng)一的操作接口
e)?網(wǎng)絡(luò)協(xié)議棧:提供各種網(wǎng)絡(luò)協(xié)議
f)?CPU架構(gòu)相關(guān)代碼(Arch):為的是提高至移植性
g)?設(shè)備驅(qū)動程序(DD):各種設(shè)備驅(qū)動,占到內(nèi)核的70%左右代碼
二、Linux內(nèi)核源碼簡介
1.?源碼獲取
Linux內(nèi)核獲取有兩種方法,一種是在www.kernel.org?直接獲取,另一種是使用git獲?。ň唧w方法參考網(wǎng)絡(luò))。
2.?源碼目錄簡介
其源碼主要有以下目錄(介紹重要目錄):
a)?Arch目錄:存放處理器相關(guān)的代碼。下設(shè)子目錄,分別對應(yīng)具體的CPU,每個子目錄有boot,mm,以及kernel三個子目錄,分別對應(yīng)系統(tǒng)引導(dǎo)以及存儲管理,和系統(tǒng)調(diào)用
b)?Include目錄:內(nèi)核所需要的大部分頭文件目錄。與平臺無關(guān)的在include/linux子目錄下,與平臺相關(guān)的則放在include相應(yīng)的子目錄中。
c)?fs目錄:存放各種文件系統(tǒng)的實現(xiàn)代碼。
d)?init目錄:init子目錄包含核心的初始化代碼(不是系統(tǒng)的引導(dǎo)代碼)。其包含兩個文件main.c和version.c,可以用來研究核心如何工作。
e)?ipc目錄:包含核心進(jìn)程間的通信代碼。
f)?kernel目錄:包含內(nèi)核管理的核心代碼。與硬件相關(guān)代碼放在arch/*/kernel目錄下。
g)?mm目錄:包含了所有的內(nèi)存管理代碼。與硬件相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下。
h)?scripts目錄:包含用于配置核心的腳本文件。
i)?lib目錄:包含了核心的庫代碼,與硬件相關(guān)的庫代碼被放在arch/*/lib/目錄下
三、?Linux內(nèi)核配置、編譯、安裝
1.?X86配置
Linux內(nèi)核的編譯有兩種方法,具體如下:
a)?交互式:在內(nèi)核頂層的目錄下運行make config,按照提示一步一步的按照自己的需求對內(nèi)核進(jìn)行配置。
b)?菜單式:在內(nèi)核頂層的目錄下運行make menuconfig,菜單式的按照自己的需求對內(nèi)核進(jìn)行配置。
2.?X86編譯
Linux內(nèi)核的編譯要經(jīng)過以下步驟,具體如下:
1.?內(nèi)核編譯:linux內(nèi)核的編譯有以下兩種方法。
n?make zImage:編譯出的內(nèi)核小于512k(老版本內(nèi)核)
n?make bzImage:通用編譯命令
注:在以上兩個命令中加V=1可查看編譯過程中的詳細(xì)信息
2.?內(nèi)核模塊編譯:執(zhí)行make modules編譯內(nèi)核模塊。
3.?內(nèi)核模塊安裝:執(zhí)行make modules_install將編譯好的內(nèi)核模塊復(fù)制到當(dāng)前系統(tǒng)的/lib/modules下的**目錄下。
4.?內(nèi)核模塊打包:執(zhí)行mkinitrd initrd-$version $version對內(nèi)核模塊進(jìn)行打包,其中initrd-$version表示要打包為的文件的名字,$version表示要打包的目錄即我們上一步生成的目錄。
3.?X86安裝
Linux內(nèi)核的安裝要經(jīng)過以下步驟,具體如下:
a)?拷貝內(nèi)核:復(fù)制1編譯出來的內(nèi)核映像到啟動目錄cp arch/$cpu/boot/bzImage(1編譯出來的bzimage)/boot/vmlinuz-$version
b)?拷貝內(nèi)核模塊文件:執(zhí)行cp initrd-$version(4生成的文件) /boot/ 將4生成的文件拷貝到boot下
c)?修改啟動配置文件:修改/etc/grub.conf文件