從本篇博文開始我将對linux核心進行學習和分析,整個過程必将十分艱辛,但我會堅持到底,同時在博文中如果那些地方有問題還請各位大神為我講解。
今天我們會分析到以下内容:
1. Linux體系結構簡介
2. Linux核心源碼簡介
3. Linux核心配置、編譯、安裝
1. Linux體系結構(linux系統構成)
Linux可以分為兩部分,分别為使用者空間和核心空間具體如下圖:
a) 使用者空間包括:使用者的應用程式、C庫
b) 核心空間包括:系統調用接口、核心(狹義核心)、平台架構相關的代碼
2. 為什麼要分為核心空間和使用者空間
我們在分析u-boot的時候就說到過,我們的cpu在不同的工作模式下可以通路的寄存器是不一樣的,是以為了保護我們的作業系統,避免使用者程式将核心搞崩,是以進行了核心空間和使用者空間的劃分。
b) X86處理器工作模式劃分:Ring0—Ring3,Ring0下可以執行特權指令,可以通路IO裝置,Ring3則有很多的限制
注:我們可以通過系統調用和硬體中斷來完成使用者空間到核心空間的轉移
3. Linux核心結構(廣義核心)
Linux核心由七個部分構成,具體如下圖:
a) 系統調用接口(SCI):open、read、write等系統調用
b) 程序管理(PM):建立程序、删除程序、排程程序等
c) 記憶體管理(MM):記憶體配置設定、管理等
d) 虛拟檔案系統(VFS):為多種檔案系統提供統一的操作接口
e) 網絡協定棧:提供各種網絡協定
f) CPU架構相關代碼(Arch):為的是提高至移植性
g) 裝置驅動程式(DD):各種裝置驅動,占到核心的70%左右代碼
l Linux核心源碼簡介
1. 源碼擷取
2. 源碼目錄簡介
其源碼主要有以下目錄(介紹重要目錄):
a) Arch目錄:存放處理器相關的代碼。下設子目錄,分别對應具體的CPU,每個子目錄有boot,mm,以及kernel三個子目錄,分别對應系統引導以及存儲管理,和系統調用
b) Include目錄:核心所需要的大部分頭檔案目錄。與平台無關的在include/linux子目錄下,與平台相關的則放在include相應的子目錄中。
c) fs目錄:存放各種檔案系統的實作代碼。
d) init目錄:init子目錄包含核心的初始化代碼(不是系統的引導代碼)。其包含兩個檔案main.c和version.c,可以用來研究核心如何工作。
e) ipc目錄:包含核心程序間的通信代碼。
f) kernel目錄:包含核心管理的核心代碼。與硬體相關代碼放在arch/*/kernel目錄下。
g) mm目錄:包含了所有的記憶體管理代碼。與硬體相關的記憶體管理代碼位于arch/*/mm目錄下。
h) scripts目錄:包含用于配置核心的腳本檔案。
i) lib目錄:包含了核心的庫代碼,與硬體相關的庫代碼被放在arch/*/lib/目錄下
l Linux核心配置、編譯、安裝
1. X86配置
Linux核心的編譯有兩種方法,具體如下:
a) 互動式:在核心頂層的目錄下運作make config,按照提示一步一步的按照自己的需求對核心進行配置。
b) 菜單式:在核心頂層的目錄下運作make menuconfig,菜單式的按照自己的需求對核心進行配置。
2. X86編譯
Linux核心的編譯要經過以下步驟,具體如下:
1. 核心編譯:linux核心的編譯有以下兩種方法。
n make zImage:編譯出的核心小于512k(老版本核心)
n make bzImage:通用編譯指令
注:在以上兩個指令中加V=1可檢視編譯過程中的詳細資訊
2. 核心子產品編譯:執行make modules編譯核心子產品。
3. 核心子產品安裝:執行make modules_install将編譯好的核心子產品複制到目前系統的/lib/modules下的**目錄下。
4. 核心子產品打包:執行mkinitrd initrd-$version $version對核心子產品進行打包,其中initrd-$version表示要打包為的檔案的名字,$version表示要打包的目錄即我們上一步生成的目錄。
3. X86安裝
Linux核心的安裝要經過以下步驟,具體如下:
a) 拷貝核心:複制1編譯出來的核心映像到啟動目錄cp arch/$cpu/boot/bzImage(1編譯出來的bzimage)/boot/vmlinuz-$version
b) 拷貝核心子產品檔案:執行cp initrd-$version(4生成的檔案) /boot/ 将4生成的檔案拷貝到boot下
c) 修改啟動配置檔案:修改/etc/grub.conf檔案