構造嵌入式Linux(一):Kernel編譯

來源:互聯網
上載者:User

使用交叉編譯環境


建立好自己的交叉編譯環境,就可以進行kernel的編譯。這部分也是對O'Reilly的《Building Embeded Linux System》的第五章的一個實踐。我們仍使用moblin作為例子。他已經為kernel提供了config檔案的例子。對於menlow,需要將config-generic和config-menlow進行合并。可以在generic的基礎上,通過手工根據menlow的配置來改動,也可以使用moblin提供的merge.pl,merg.pl config-generic config-menlow >
wei-config,然後cp wei-config .config,即可
。在alpha3的版本似乎merge的結果有些問題,還是需要進行手動來改,但是在beta的版本中,沒有問題。

$ make ARCH=x86 CROSS_COMPILE=i586-linux- bzImage
  『由於kernel比較大,如果使用zImage,會報錯,要求使用bzImage』
$ make ARCH=x86 CROSS_COMPILE=i586-linux- modules
 

對於交叉編譯環境,為了不會出現誤操作,覆蓋我們host系統檔案,不要使用root的身份進行。在完成編譯之後,我們整理產生的關鍵系統檔案,並將其儲存好:

$ cp System.map $PRJROOT/images/myproject/System.map-2.6.29-menlow
$ cp vmlinux $PRJROOT/images/myproject/vmlinux-2.6.29-menlow
$ cp .config $PRJROOT/images/myproject/2.6.29-menlow.config
$ cp arch/x86/boot/bzImage $PRJROOT/images/myproject/bzImage2.6.29-menlow
$ mkdir modules-2.6.29-menlow
//用於存放我們modules

安裝模組,存放在指定的位置:$ make ARCH=x86 CROSS_COMPILE=i586-linux- INSTALL_MOD_PATH=$PRJROOT/images/myproject/modules-2.6.29-menlow modules_install

我們需要通過busybox來建立模組之間的依賴關係。

$ wget http://busybox.net/downloads/busybox-1.13.4.tar.bz2
$ cd busybox-1.1.1
$ make defconfig
  //使用預設配置,可以通過 make menuconfig來進行配置,好多選項
$ make

BusyBox 最初是由 Bruce Perens 在 1996 年為 Debian GNU/Linux 安裝盤編寫的。其目標是在一張磁碟片上建立一個可引導的 GNU/Linux 系統,這可以用作安裝盤和急救盤。一張磁碟片可以儲存大約 1.4-1.7MB 的內容,因此這裡沒有多少空間留給 Linux 核心以及相關的使用者應用程式使用。BusyBox 揭露了這樣一個事實:很多標準 Linux 工具都可以共用很多共同的元素。例如,很多基於檔案的工具(比如grep和find)都需要在目錄中搜尋檔案的代碼。當這些工具被合并到一個可執行程式中時,它們就可以共用這些相同的元素,這樣可以產生更小的可執行程式。實際上, BusyBox 可以將大約 3.5MB 的工具封裝成大約 200KB 大小。這就為可引導的磁碟和使用 Linux 的嵌入式裝置提供了更多功能。我們可以對 2.4 和 2.6 版本的 Linux 核心使用 BusyBox。

在exampls/depmod.pl放置在工具位置中。

$ depmod.pl –k ./vmlinux-2.6.29-menlow [或者使用-F System.map-2.6.29-menlow] –b $PRJROOT/images/myproject/modules-2.6.29-menlow/lib/modules/2.6.29.1-menlow  $PRJROOT/images/myproject/modules-2.6.29-menlow/lib/modules/2.6.29.1-menlow/modules.dep

重建modules.dep,我也將其copy到$PRJROOT/images/myproject/modules.dep-2.6.29-menlow。

使用MIC2的開發環境


在MIC2中有moblin-chroot工具,可以產生我們的開發環境,並提供類比的target。我們在產生image的kickstart檔案中直接將kernel-netbook改為kernel-menlow ,發安裝的時候出現花屏現象,如果我們將netbook的img在MID上安裝,可以裝上,但是速度很慢,可能和CPU的適配有關係,不可以容忍。在加上各類的driver之前,我們需要在netbook版本的基礎上,將kernel適配menlow晶片。

  • [wei@wei project]$ sudo moblin-chroot -s wei-kernel-chroot --unpack-only moblin-netbook-core-developer-alpha3-200905081154.usbimg
    //進入類比環境
  • [wei@wei project]$ sudo moblin-chroot wei-kernel-chroot/
  • bash-3.2# alias ls="ls --color"
    //不習慣沒有顏色的情況,修正一下
  • bash-3.2# rpm -ivh kernel-2.6.29.1-18.1.moblin2.src.rpm
    //解開rpm的包
  • bash-3.2# cd ~
    bash-3.2# echo %_default_patch_fuzz 2 > .rpmmacros

    在 alpha3中alpha3版本中帶補丁,使用fuzz 0,出現錯誤:
    Patch #8 (linux-2.6.29-drm-revert.patch):
    + /bin/cat /home/wei/rpmbuild/SOURCES/linux-2.6.29-drm-revert.patch
    + /usr/bin/patch -s -p1 --fuzz=0
    -- saving rejects to file drivers/gpu/drm/i915/i915_dma.c.rej
    1 out of 1 hunk FAILED -- saving rejects to file drivers/gpu/drm/i915/i915_drv.h.rej
    error: Bad exit status from /var/tmp/rpm-tmp.JUmRvI (%prep)需要至為fuzz 2,但是在beta版本中,沒有這個問題,無需此步驟 。fuzz:如果找不到這些位置,且如果 patch 命令正在應用上下文差異列表,patch 命令能進行非精確搜尋。fuzz factor 指定了非精確匹配的行數目。如果模糊因子設定成 1 或者更大,patch 命令執行第二次掃描,這一次忽略內容相關的第一行和最後一行。如果沒有匹配結果,且最大模糊因子設定成 2 或者更大, patch 命令執行第三次掃描,這一次會忽略內容相關的前兩行和最後兩行。(預設模糊因子最大值為 2)。如果找不到匹配的位置,patch 命令在拒絕檔案中放置塊(hunk)。建立拒絕檔案時,其名稱和輸出檔案一樣,只是在檔案名稱有尾碼 .rej。使用 -r 標誌可以覆蓋此命名規範。
  • bash-3.2# cd rpmbuild/
    bash-3.2# ls
    SOURCES  SPECS
    bash-3.2# cd SPECS/
    bash-3.2# rpmbuild -bp kernel.spec
    //打補丁
  • 產生.config的方式同交叉編譯環境
  • bash-3.2# make ARCH=x86 bzImage
  • bash-3.2# make ARCH=x86 modules
  • bash-3.2# make ARCH=x86 modules_install
  • 可以通過yum來匯入busybox,但是我找遍到depmod.pl,有提供depmod,但是啟動並執行時候有報錯,我還是下載了busybox的包,運行#~/bin/depmod.pl -k ./vmlinux-2.6.29-menlow -b /lib/modules/2.6.29.3-menlow/  /lib/modules/2.6.29.3-menlow/modules.dep

我試過直接使用make install來安裝,
make install似乎將bzImage的檔案copy到/boot下面作為vmlinuz。但是想通過MIC2將其製作為img的時候,出現以下報錯:

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
tune2fs 1.41.3 (12-Oct-2008)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
Copying filesystem...
Error creating Live CD : Unable to copy valid kernels or initrds, please check the repo
Your new image can be found here:
Finished.

這個問題,需要進一步解決。在moblin中沒有/etc/grub.conf檔案,而/boot/grub和普通的linux長得不一樣。
原因是在/boot裡面沒有發現initrd-檔案。這個檔案似乎在make modules_install的步驟中被刪除。

修改時區



:

1,在/usr/share/zoneinfo/目錄下查詢想要更換的時區名稱
2,將原有的localtime檔案移走;
       # mv /etc/localtime  /etc/localtime-old
3,做新的localtime檔案,將對應的時區檔案連結過來
       # ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.