一、linux體系結(jié)構(gòu)
linux由內(nèi)核空間與用戶空間兩部分組成,用戶空間主要是應(yīng)用程序和C庫,內(nèi)核空間包含了像系統(tǒng)調(diào)用接口,體系結(jié)構(gòu)相關(guān)的代碼。
現(xiàn)在的CPU實現(xiàn)了不同的工作模式,以ARM為例,實現(xiàn)了其中工作模式:
用戶模式(usr)、快速中斷(fiq)、外部中斷(irq)、管理模式(SVC)、數(shù)據(jù)訪問終止(abt)、系統(tǒng)模式(sys)、未定義指令異常(und)。
X86也實現(xiàn)了四個不同的級別:Ring0-Ring3 。 Ring0下,可以執(zhí)行特權(quán)指令,可以訪問IO設(shè)備等,在Ring3則有很多限制。Linux系統(tǒng)利用了CPU的這一特性,使用了其中的兩級來分別運行l(wèi)inux內(nèi)核與應(yīng)用程序,這樣使操作系統(tǒng)本身得到了充分保護。例如:如果使用X86,用戶代碼運行在Ring3,內(nèi)核代碼運行在Ring0.
內(nèi)核空間與用戶空間是程序執(zhí)行的兩種不同的狀態(tài),通過系統(tǒng)調(diào)用和硬件中斷能夠完成從用戶空間到內(nèi)核空間的轉(zhuǎn)移。
linux 內(nèi)核架構(gòu)(這里用表模擬下)
| System Call Interface | ||
|---|---|---|
| Porcess Management(PM) | Virtual Files System(VFS) | |
| Memory Managemet(MM) | Network stack | |
| ARCH | Device Drivers(DD) |
二、linux內(nèi)核源代碼
2.1 源代碼下載
www.kernel.org 官網(wǎng)進行下載即可
2.2 目錄結(jié)構(gòu)(樹形結(jié)構(gòu))
arch目錄:architecture的縮寫。內(nèi)核所支持的每種CPU體系,在該目錄下都有對應(yīng)的子目錄。每個CPU的子目錄,又進一步分解為boot,mm,kernel等目錄,分別包含控制系統(tǒng)引導(dǎo),內(nèi)存管理,系統(tǒng)調(diào)用等。
document目錄:內(nèi)核的文檔部分
drivers目錄:設(shè)備的驅(qū)動程序目錄
include目錄:內(nèi)核所需要的頭文件。與平臺無關(guān)的頭文件在 include/linux 子目錄下,與平臺相關(guān)的頭文件在相應(yīng)的子目錄中。
fs目錄:存放各種文件系統(tǒng)的實現(xiàn)代碼。每個子目錄對應(yīng)一種文件系統(tǒng)的實現(xiàn),公用的源程序用于實現(xiàn)虛擬文件系統(tǒng)VFS:
||--devpts /dev/pts 虛擬文件系統(tǒng)
||--ext2 第二擴展文件系統(tǒng)
||--fat MS的fat32文件系統(tǒng)
||--isofs ISO9660光盤CD-ROM上的文件系統(tǒng)
net目錄:網(wǎng)絡(luò)協(xié)議的實現(xiàn)代碼:
||--802 802無線通訊協(xié)議核心支持代碼
||--appletalk 與蘋果設(shè)備互聯(lián)協(xié)議
||--ax25 AX25無線Internet協(xié)議
||--bridge 橋接設(shè)備
||--ipv4 IP協(xié)議簇V4版32位尋址模式
||--ipv6 IP協(xié)議簇V6版128位尋址模式
三、linux內(nèi)核配置與編譯
配置內(nèi)核:硬件需求,軟件需求。
make config 這種方法是采用文本模式的配置
make menuconfig 這種是基于文本模式的菜單形配置
首選是采用菜單形配置(直觀、簡單、高效)
使用make menuconfig 配置內(nèi)核
Process type and features
-----Process family
Networking support
-----Networking Options
Devices Drivers
-----Network device support
File system
這里說明下“[ ]”這種只有兩種選擇方式,有或者沒有。而“ < > ”這種有三種選擇方式。
<M> 內(nèi)核模塊,編譯成.ko 動態(tài)調(diào)用。 “[]”直接便一道zImage內(nèi)核映像中。
源代碼的根目錄中.config文件保存了內(nèi)核配置結(jié)果,在源代碼目錄中使用 # ls -a 進行查看。
配置捷徑:①:使用已有的配置項來改。 ②:不清楚的為默認(rèn)值。
操作步驟如下:使用內(nèi)核配置文件簡化配置,當(dāng)前l(fā)inux系統(tǒng)的配置文件在 /boot/config-xxxx,如果是使用紅帽6, 2.6.39內(nèi)核可以直接使用其進行配置,將該 /boot/config-xxxx 文件復(fù)制到內(nèi)核源代碼。并輸入以下命令
make menuconfig -> load an Alternate configuration File
填寫剛剛復(fù)制的文件名字進入,保存后利用已經(jīng)有的配置文件進行修改。
配置內(nèi)核實際上工作很多,但是如果有廠商之前給你做好了相關(guān)配置文件,比如我這里購買的smart210,友善之臂提供了相關(guān)的配置文件名字叫 mini210_linux_defconfig(mini210和smart210基本一樣)這個文件,這個就是廠商配置文件,這里我的在內(nèi)核的根目錄下面,使用下面命令就可以直接使用該配置文件進行編譯:
cp mini210_linux_defconfig .config
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
這樣即可編譯成功,同樣還有一種方法簡化內(nèi)核配置,在 內(nèi)核arch/arm/configs 中找到自己板子的默認(rèn)配置,基于這個配置進行修改也是很好的,使用起來也很簡單.
make xxx_defconfig
make menu_config ARCH=arm
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
3.1 編譯內(nèi)核
<*> -> zImage
[M] -> 內(nèi)核模塊
make zImage 在X86平臺上,zImage內(nèi)核只能用于512KB的文件大小。
//所以一般都用下面的
make bzImage
如果需要獲取詳細的編譯信息,可使用
make zImage V=1
make bzImage V=1
編譯好的內(nèi)核在: arch/<cpu>/boot
3.2 編譯內(nèi)核模塊
make modules (大概一個小時時間,比較長)
make modules_install
編譯過后生成的文件遍布于各個目錄中,凡是以 *.ko 結(jié)尾的都是內(nèi)核模塊
make modules_install (將 *.ko 全部移動到/lib/modules)
這里是linux主機的/lib/不是源碼的目錄。
3.3 制作ramdisk
方法:mkinitrd initrd-$version $version
例:
mkinitrd initrd-2.6.39 2.6.39
// *$version 可以通過查詢 /lib/modules 下目錄得到。
3.4 安裝內(nèi)核(x86)
cp arch/x86/boot/bzImage /boot/vmlinuz-$version
cp initrd-$version /boot/
修改 /etc/grub.conf
3.5 清理文件
make clean :清理 *.0 *.ko 等文件
make distclean :在上面的基礎(chǔ)上
四、嵌入式linux內(nèi)核制作
4.1 清除相關(guān)文件
make distclean
4.2 配置內(nèi)核
make menuconfig (x86)
make menuconfig ARCH=arm (ARM)
4.3 編譯內(nèi)核
make bzImage (X86)
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
可能以上編譯或許過不去,可能是因為源碼中有配置initramfs這個掛載根文件系統(tǒng)的,所以過不去,因為這里還沒有設(shè)置根文件系統(tǒng),同時可能還有一個問題就是還缺少mkimage這個工具,需要從已經(jīng)編譯好的u-boot源碼中tools中拷貝使用:
cp mkimage /bin/ 這里注意是拷貝到宿主機中