一猿涨、linux體系結(jié)構(gòu)
linux由內(nèi)核空間與用戶空間兩部分組成叽粹,用戶空間主要是應(yīng)用程序和C庫(kù)秘通,內(nèi)核空間包含了像系統(tǒng)調(diào)用接口铺浇,體系結(jié)構(gòu)相關(guān)的代碼痢畜。
現(xiàn)在的CPU實(shí)現(xiàn)了不同的工作模式,以ARM為例,實(shí)現(xiàn)了其中工作模式:
用戶模式(usr)丁稀、快速中斷(fiq)吼拥、外部中斷(irq)、管理模式(SVC)线衫、數(shù)據(jù)訪問(wèn)終止(abt)凿可、系統(tǒng)模式(sys)、未定義指令異常(und)授账。
X86也實(shí)現(xiàn)了四個(gè)不同的級(jí)別:Ring0-Ring3 枯跑。 Ring0下,可以執(zhí)行特權(quán)指令白热,可以訪問(wèn)IO設(shè)備等敛助,在Ring3則有很多限制。Linux系統(tǒng)利用了CPU的這一特性屋确,使用了其中的兩級(jí)來(lái)分別運(yùn)行l(wèi)inux內(nèi)核與應(yīng)用程序纳击,這樣使操作系統(tǒng)本身得到了充分保護(hù)。例如:如果使用X86攻臀,用戶代碼運(yùn)行在Ring3评疗,內(nèi)核代碼運(yùn)行在Ring0.
內(nèi)核空間與用戶空間是程序執(zhí)行的兩種不同的狀態(tài),通過(guò)系統(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)進(jìn)行下載即可
2.2 目錄結(jié)構(gòu)(樹(shù)形結(jié)構(gòu))
arch目錄:architecture的縮寫砌些。內(nèi)核所支持的每種CPU體系呜投,在該目錄下都有對(duì)應(yīng)的子目錄。每個(gè)CPU的子目錄存璃,又進(jìn)一步分解為boot仑荐,mm,kernel等目錄纵东,分別包含控制系統(tǒng)引導(dǎo)粘招,內(nèi)存管理,系統(tǒng)調(diào)用等偎球。
document目錄:內(nèi)核的文檔部分
drivers目錄:設(shè)備的驅(qū)動(dòng)程序目錄
include目錄:內(nèi)核所需要的頭文件洒扎。與平臺(tái)無(wú)關(guān)的頭文件在 include/linux 子目錄下,與平臺(tái)相關(guān)的頭文件在相應(yīng)的子目錄中衰絮。
fs目錄:存放各種文件系統(tǒng)的實(shí)現(xiàn)代碼袍冷。每個(gè)子目錄對(duì)應(yīng)一種文件系統(tǒng)的實(shí)現(xiàn),公用的源程序用于實(shí)現(xiàn)虛擬文件系統(tǒng)VFS:
||--devpts /dev/pts 虛擬文件系統(tǒng)
||--ext2 第二擴(kuò)展文件系統(tǒng)
||--fat MS的fat32文件系統(tǒng)
||--isofs ISO9660光盤CD-ROM上的文件系統(tǒng)
net目錄:網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)代碼:
||--802 802無(wú)線通訊協(xié)議核心支持代碼
||--appletalk 與蘋果設(shè)備互聯(lián)協(xié)議
||--ax25 AX25無(wú)線Internet協(xié)議
||--bridge 橋接設(shè)備
||--ipv4 IP協(xié)議簇V4版32位尋址模式
||--ipv6 IP協(xié)議簇V6版128位尋址模式
三猫牡、linux內(nèi)核配置與編譯
配置內(nèi)核:硬件需求胡诗,軟件需求。
make config 這種方法是采用文本模式的配置
make menuconfig 這種是基于文本模式的菜單形配置
首選是采用菜單形配置(直觀、簡(jiǎn)單煌恢、高效)
使用make menuconfig 配置內(nèi)核
Process type and features
-----Process family
Networking support
-----Networking Options
Devices Drivers
-----Network device support
File system
這里說(shuō)明下“[ ]”這種只有兩種選擇方式骇陈,有或者沒(méi)有。而“ < > ”這種有三種選擇方式瑰抵。
<M> 內(nèi)核模塊你雌,編譯成.ko 動(dòng)態(tài)調(diào)用。 “[]”直接便一道zImage內(nèi)核映像中谍憔。
源代碼的根目錄中.config文件保存了內(nèi)核配置結(jié)果匪蝙,在源代碼目錄中使用 # ls -a 進(jìn)行查看。
配置捷徑:①:使用已有的配置項(xiàng)來(lái)改习贫。 ②:不清楚的為默認(rèn)值逛球。
操作步驟如下:使用內(nèi)核配置文件簡(jiǎn)化配置,當(dāng)前l(fā)inux系統(tǒng)的配置文件在 /boot/config-xxxx苫昌,如果是使用紅帽6颤绕, 2.6.39內(nèi)核可以直接使用其進(jìn)行配置,將該 /boot/config-xxxx 文件復(fù)制到內(nèi)核源代碼祟身。并輸入以下命令
make menuconfig -> load an Alternate configuration File
填寫剛剛復(fù)制的文件名字進(jìn)入奥务,保存后利用已經(jīng)有的配置文件進(jìn)行修改。
配置內(nèi)核實(shí)際上工作很多,但是如果有廠商之前給你做好了相關(guān)配置文件,比如我這里購(gòu)買的smart210,友善之臂提供了相關(guān)的配置文件名字叫 mini210_linux_defconfig(mini210和smart210基本一樣)這個(gè)文件,這個(gè)就是廠商配置文件,這里我的在內(nèi)核的根目錄下面,使用下面命令就可以直接使用該配置文件進(jìn)行編譯:
cp mini210_linux_defconfig .config
make uImage ARCH=arm CROSS_COMPILE=arm-linux-
這樣即可編譯成功,同樣還有一種方法簡(jiǎn)化內(nèi)核配置,在 內(nèi)核arch/arm/configs 中找到自己板子的默認(rèn)配置,基于這個(gè)配置進(jìn)行修改也是很好的,使用起來(lái)也很簡(jiǎ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平臺(tái)上袜硫,zImage內(nèi)核只能用于512KB的文件大小氯葬。
//所以一般都用下面的
make bzImage
如果需要獲取詳細(xì)的編譯信息,可使用
make zImage V=1
make bzImage V=1
編譯好的內(nèi)核在: arch/<cpu>/boot
3.2 編譯內(nèi)核模塊
make modules (大概一個(gè)小時(shí)時(shí)間婉陷,比較長(zhǎng))
make modules_install
編譯過(guò)后生成的文件遍布于各個(gè)目錄中帚称,凡是以 *.ko 結(jié)尾的都是內(nèi)核模塊
make modules_install (將 *.ko 全部移動(dòng)到/lib/modules)
這里是linux主機(jī)的/lib/不是源碼的目錄。
3.3 制作ramdisk
方法:mkinitrd initrd-$version $version
例:
mkinitrd initrd-2.6.39 2.6.39
// *$version 可以通過(guò)查詢 /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-
可能以上編譯或許過(guò)不去,可能是因?yàn)樵创a中有配置initramfs這個(gè)掛載根文件系統(tǒng)的担神,所以過(guò)不去楼吃,因?yàn)檫@里還沒(méi)有設(shè)置根文件系統(tǒng),同時(shí)可能還有一個(gè)問(wèn)題就是還缺少mkimage這個(gè)工具妄讯,需要從已經(jīng)編譯好的u-boot源碼中tools中拷貝使用:
cp mkimage /bin/ 這里注意是拷貝到宿主機(jī)中