專題3-嵌入式linux內(nèi)核制作

一、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/      這里注意是拷貝到宿主機中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們說的Linux其實指的就是 內(nèi)核(kernel)而已。這個內(nèi)核控制你主機的所有硬件并提供系統(tǒng)所有的功能,所以它...
    Zhang21閱讀 7,688評論 0 18
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,269評論 2 33
  • 姓名:吳兆陽 學(xué)號:14020199009 轉(zhuǎn)自韋東山 嵌牛導(dǎo)讀:對嵌入式初學(xué)者,沒有足夠的視野選擇一個合適投入方...
    吳兆陽閱讀 2,521評論 0 4
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 100,727評論 9 468
  • 對于有的人來說,失眠意味著初入睡時的輾轉(zhuǎn)反側(cè)、難以成眠;對于有的人來說,意味著半夜時分半睡半醒之間那些散落在潛意識...
    心遠軒閱讀 214評論 0 0

友情鏈接更多精彩內(nèi)容