如何編譯一個可以啟動並執行 uClinux Kernel

來源:互聯網
上載者:User
 

uClinux Image Compiling User Guide2

uClinux Image Compiling User Guide2 for lumit4510 : how to compile uClinux kernel

說明: 本小節內容是關於如何編譯一個可以啟動並執行 uClinux Kernel ( 基於 20040408  版 )

-------------------------------------------------------------------------

這篇文檔詳細說明了如何從 RedHat9.0 開始,建立交叉編譯環境,編譯 uClinux 核心,
如何通過 SkyEye 模擬器進行事先驗證,然後再下載到真實開發板執行,最後添加自己的應用程式。

有 linux pc 環境的可以在自己的機器上面動手試試,特別適合於還沒有開發板的初學者。
**************************************************************************

Step 0 :  安裝交叉編譯器 GNU Toolchain
1. 下載 arm-elf-tools-20011219.tar.gz
 http://159.226.40.150/lumit/resources/uClinux/Toolchain/arm-elf-tools-20011219.tar.gz

2. 下載 arm-elf-tools-20030314.sh
 http://159.226.40.150/lumit/resources/uClinux/Toolchain/arm-elf-tools-20030314.sh

3. 這兩個檔案需要在同一個目錄下,arm-elf-tools-20030314.sh 是一個可以自動安裝的指令檔
   改變屬性為可執行檔:
 chmod 755 arm-elf-tools-20030314.sh 

4. 執行指令碼即可完成交叉編譯器的安裝
 ./arm-elf-tools-20030314.sh

5. 測試一下,輸入 arm-elf-gcc 看看是否能夠自動補齊?
[admin@localhost admin]$ arm-elf-gcc -v
Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specs
gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)

[admin@localhost admin]$ which arm-elf-gcc
/usr/local/bin/arm-elf-gcc  

表明 arm-elf-gcc 已經安裝在 /usr/local/bin/ 目錄下了。

Step 1 :   交叉編譯 uClinux 核心
1. 下載 uClinux-dist-20040408.tar.gz 到當前工作目錄下
        http://159.226.40.150/lumit/resources/uClinux/uClinux-dist-20040408.tar.gz

2. 解壓 uClinux-dist-20040408.tar.gz 檔案到 uClinux-dist 目錄
        tar xvzf uClinux-dist-20040408.tar.gz
   此時當前工作目錄下增加了一個名為 uClinux-dist 的目錄。

3. 進入 uClinux-dist 目錄
        cd uClinux-dist

4. 修改 vmlinux-armv.lds.in 檔案,
        vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in
   在
 *(got)  /* Global Offset table */
 之後添加如下語句:
 romfs_data = .;
 romfs.o
 romfs_data_end = .;
   即修改為:
     65                 *(.got)                 /* Global offset table          */
     66
     67                 /* add by lumit - http://www.lumit.org */
     68                 romfs_data = .;
     69                 romfs.o
     70                 romfs_data_end = .;

5. 修改 vendors/Samsung/4510B/Makefile 檔案,
        vi vendors/Samsung/4510B/Makefile
   在 image 目標的第三行,增加一條語句:
 arm-elf-ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o -b binary $(ROMFSIMG)
   如下為增加之後:
     63 image:
     64         [ -d $(IMAGEDIR) ] || mkdir -p $(IMAGEDIR)
     65         genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR)
     66         arm-elf-ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o -b binary $(ROMFSIMG)
     67         $(CROSS_COMPILE)objcopy -O binary --remove-section=.romvec /
     68                         --remove-section=.text --remove-section=.ramvec /
     69                         --remove-section=.init /
     70                         --remove-section=.bss --remove-section=.eram /
     71                         $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.data

6. make menuconfig
   在 Vendor/Product Selection  --->    中選擇
 --- Select the Vendor you wish to target 
 (Samsung) Vendor
 --- Select the Product you wish to target
 (4510B) Samsung Products
                          
   在 Kernel/Library/Defaults Selection  --->   中選擇
 (linux-2.4.x) Kernel Version                              
 (uClibc) Libc Version 

其他選項都不變,按照預設設定,選擇退出,儲存配置。

7. make dep

8. make lib_only

9. make user_only
[說明] 編譯login,boa程式時可能出現 undefined reference to 'crypt_old'的錯誤,
boa.elf2flt: In function `auth_check_userpass':
/tmp/liming/uClinux-dist/user/boa/src/auth.c:281: undefined reference to `crypt_old'
可以修改
config/.config
注釋掉第25行的 CONFIG_USER_OLD_PASSWORDS
如下:
     24 CONFIG_USER_LOGIN_LOGIN=y
     25 # CONFIG_USER_OLD_PASSWORDS=y
     26 # CONFIG_USER_ONLY_ROOT is not set
然後再
cd user/boa/src/
rm *.o
重新編譯 make user_only 一下這個目錄裡面的 obj 檔案就可以了。

10. make romfs

11. make
arch/armnommu/mm/mm.o: In function `free_initmem':
/tmp/liming/uClinux-dist/linux-2.4.x/arch/armnommu/mm/init.c:240: undefined reference to `machine_is_ta7v'
這個錯誤只要注釋該檔案的相關代碼即可。
    655 void free_initmem(void)
    656 {
    657         if (!machine_is_integrator() &&
    658             !machine_is_p52() &&
    659             !machine_is_cx821xx() &&
    660             !machine_is_atmel() &&
    661             !machine_is_netarm() &&
    662 //          !machine_is_ta7v() &&
    663             !machine_is_ta7s()) {
    664                 free_area((unsigned long)(&__init_begin),
    665                           (unsigned long)(&__init_end),
    666                           "init");

12. make image
此時得到 linux-2.4.x/linux 檔案和 image.bin

Step 2:   通過 SkyEye 測試剛才編譯得到的 linux-2.4.x/linux 核心是否可以運行。

Step 3:   如果 SkyEye 模擬器上測試通過了,那麼就可以下載到 lumit4510 開發板試試了。

Step 4:   如果在 lumit4510 上可以運行 image.ram ,那麼就可以添加自己的應用程式了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.