從本篇博文開始我將對linux內核進行學習和分析,整個過程必將十分艱辛,但我會堅持到底,同時在博文中若是那些地方有問題還請各位大神爲我講解。linux
今天咱們會分析到如下內容:git
1. Linux體系結構簡介網絡
2. Linux內核源碼簡介架構
3. Linux內核配置、編譯、安裝post
1. Linux體系結構(linux系統構成)url
Linux能夠分爲兩部分,分別爲用戶空間和內核空間具體以下圖:spa
a) 用戶空間包括:用戶的應用程序、C庫操作系統
b) 內核空間包括:系統調用接口、內核(狹義內核)、平臺架構相關的代碼
2. 爲何要分爲內核空間和用戶空間
咱們在分析u-boot的時候就說到過,咱們的cpu在不一樣的工做模式下能夠訪問的寄存器是不同的,因此爲了保護咱們的操做系統,避免用戶程序將內核搞崩,因此進行了內核空間和用戶空間的劃分。
a) Arm處理器工做模式劃分:usr、FIQ、IRQ、svc、abt、und、sys(具體介紹在http://www.cnblogs.com/wrjvszq/p/4199682.html)
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. 源碼獲取
Linux內核獲取有兩種方法,一種是在www.kernel.org 直接獲取,另外一種是使用git獲取(具體方法參考網絡)。
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文件