在RedHat9.2上搭建uClinux編譯開發環境並用skyeye進行仿真

在RedHat9.2上搭建uClinux編譯開發環境並用skyeye進行仿真

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

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

一. 工欲善其事,必先利其器,安裝交叉編譯器 GNU Toolchain
1. 下載 arm-elf-tools-20011219.tar.gz    (到http://www.uclinux.org/pub/uClinux/arm-elf-tools/)

2. 下載 arm-elf-tools-20030314.sh       (到http://www.uclinux.org/上找找, 不行就去別處找找吧!)

3. 這兩個文件需要在同一個目錄下,arm-elf-tools-20030314.sh 是一個可以自動安裝的腳本文件
   改變屬性爲可執行文件:
 chmod 755 arm-elf-tools-20030314.sh 

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

5. 測試一下,輸入 arm-elf-gcc 看看是否安裝好?
[root@localhost root]# 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/)

[root@localhost root]# which arm-elf-gcc
/usr/local/bin/arm-elf-gcc
出現以上信息表示已經正確安裝, 表明 arm-elf-gcc 已經安裝在 /usr/local/bin/ 目錄下了。

二. 交叉編譯 uClinux 內核
1. 下載 uClinux-dist-20040408.tar.gz 到當前工作目錄下, 我的是/Skyeye(在根目錄下輸入: mkdir Skeyey 命令建立這個目錄)

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 here */
     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. 修改 config/.config
     vi 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

8. 修改linux-2.4.x/arch/armnommu/mm/init.c:
      vi linux-2.4.x/arch/armnommu/mm/init.c
將662行的代碼註釋掉
    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");

9. make dep

10. make lib_only

11. make user_only

12. make romfs

13. make image(容易出錯, 沒關係,我們只要在這一步生成romfs.o文件)
它的作用有2 個,一個是生成romfs 的鏡像文件,另一個是生成Linux 的鏡像。因爲原來的Linux 編譯出來是elf 格式的,不能直接用於下載或者編譯(不過那個文件也是需要的,因爲如果你需要,那個elf 格式的內核文件裏面可以包含調試的信息)。因此在這個時候由於還沒有編譯過Linux,因此在執行這一步的時候會報錯。但是沒有關係,因爲我們在這裏需要的僅僅是romfs 的鏡像,以便在下面編譯Linxu 內核的時候使用。

14. make
(可能會出現error:cannot open romfs.o,其實這個文件已經有了,在linux-2.4.x/romfs.o,copy到uC下就可以了)
有了romfs 的鏡像我們就可以編譯Linux 了。因爲我們的romfs 是嵌入到linux 內核中去了,所以在編譯Linux 內核的時候就要一個romfs.o 文件。這個文件是由上面的make image生成的。

15. 再次make

16. 再次make image
等到編譯完畢後在 images/目錄下有image.bin, linux.data, linux.text, romfs.img四個文件

17. make linux
等到編譯完畢後在 linux-2.4.x/目錄下生成linux文件, linux就是可以用skyeye仿真的文件

18. 下載skyeye軟件包skyeye-1.2-RC6.tar.bz2
http://sourceforge.net/forum/forum.php?forum_id=559047

19. 解壓並編譯skyeye
tar xvzf skyeye-1.2-RC6.tar.bz2 -C /Skyeye
cd /Skyeye/skyeye-V1
make

20. 設置環境變量
vi ~/.bashrc
加入路徑
export PATH=$PATH:/Skyeye/skyeye-V1/bin

21. 將編譯好的linux文件和skyeye.conf放到同一個目錄下
skyeye -e linux

等待一會就會出現久違的uClinux了。


##附skyeye.conf文件
#skyeye config file sample
cpu: arm7tdmi
mach: s3c4510b
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00800000
mem_bank: map=M, type=R,  addr=0x01000000, size=0x00200000
mem_bank: map=I, type=RW, addr=0x03ff0000, size=0x00010000
net: type=s3c4510b, hostip=10.0.0.2, ethmod=tuntap
#dbct:state=on

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章