分享
 
 
 

uClinux在S3C44B0X上的移植

王朝system·作者佚名  2006-05-16
窄屏简体版  字體: |||超大  

前期准备:

装有Linux系统的主机(具备c编译环境),立宇泰公司的ARMSYS44B0开发版(集成Samsung的S3C44b0X芯片)及各种连线,uClinux源代码,交叉编译工具arm-elf-tools

1.uClinux简介,基本结构,内核结构(略)

2.如果有产品的附带光盘,那路径/arm7/uClinux/uClinux下就包括了uClinux源代码,uClinux-armsys-050101.tar.gz,另外在这个目录下还提供了交叉编译工具arm-elf-tools-20030314.sh

如果手头没有这张光盘,也可以去立宇泰公司的网站(http://www.hzlitai.com.cn/download/default.asp)查找下载所需资料,但其中的uClinux源代码包是uClinux-dist-20040408.tar.gz

3.1.1 对于uClinux-armsys050101.tar.gz这个包,我们首先将它转移到/home目录下(当然在其他目录可以同样进行操作)

如果对Linux不太熟悉并希望能像在Windows下那样进行图形化的文件操作,最好以超级用户(root)登录,这是为了避免接下来的操作中出现权限限制.

如果是命令行操作,方法如下:

普通用户更换到超级用户,在提示下输入root密码(为了防止被扫描,密码输入时屏幕没有相应显示)

[Jiang@localhost ~]$ su -

Password:

用cp(拷贝命令),其中yourdir更改成你系统中arm7的目录

[root@localhost ~]# cp /yourdir/arm7/uClinux/uClinux/uClinux-armsys-050101.tar.gz /home

然后跳转到/home

[root@localhost ~]# cd /home

3.1.2 对uClinux-armsys-050101.tar.gz进行解压缩

[root@localhost ~]# tar xzvf uClinux-armsys-050101.tar.gz

参数说明:

x 从档案文件中释放文件

z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩

v 详细显示tar处理的文件信息

f 使用档案文件或设备,这个选项通常是必选的

这个过程大约需要几分钟,完成后在当前目录(/home)下多了一个文件夹uClinux-dist,进入,我们可以看到里面的文件或文件夹

[root@localhost home]# cd uClinux-dist/

[root@localhost uClinux-dist]# ls

autoconf.h kernel_44b0.cfg romfs

bin kernel_44b0.cfg.old SOURCE

config kernel_4510.cfg tools

config.arch kernel_4510.cfg.old uClibc

config.in lib uClinux-20040408-ARMSYS.patch

COPYING linux-2.4.x user

Documentation Makefile vendors

freeswan Makefile.orig

images README

其 中images文件夹下有3个文件,这是我们最终所需要的,估计这个文件夹是lyt公司打包时自己加上去的,在一般源代码中这个文件夹是没有的,到编译成 功后会自动生成,所以我把这个文件夹剪切到了其他地方.另外这里还有一个文件uClinux-20040408-ARMSYS.patch,这是 uClinux-dist-20040408.tar.gz针对S3C44B0X结构的补丁,因为uClinux-armsys- 050101.tar.gz已经针对S3C44B0X硬件结构做了参数的修改,用不着这个补丁.这里,我们可以用rm -fr直接把这两个文件删掉.

如果在Windows环境下进行解压缩可能会产生一些错误,所以推荐在Linux中解压.

3.1.3 安装交叉编译环境

首先进入到arm-elf-tools-20030314.sh所在的目录,然后

[root@localhost home]#sh arm-elf-tools-20030314.sh

执行后在/usr/local/bin路径下可以看到各种实用工具

[root@localhost uClinux-dist]# ls /usr/local/bin

arm-elf-addr2line arm-elf-g++ arm-elf-objcopy arm-elf-strings

arm-elf-ar arm-elf-gasp arm-elf-objdump arm-elf-strip

arm-elf-as arm-elf-gcc arm-elf-protoize arm-elf-unprotoize

arm-elf-c++ arm-elf-gdb arm-elf-ranlib elf2flt

arm-elf-c++filt arm-elf-ld arm-elf-readelf flthdr

arm-elf-elf2flt arm-elf-ld.real arm-elf-run genromfs

arm-elf-flthdr arm-elf-nm arm-elf-size

3.1.4内核的编译

其实这一步也很容易,有人形容是易如反掌,但有一些细节处理不好的话也很容易出错

首 先根据需要配置内核.内核提供了各种功能,支持很多的硬件,因而有许多东西需要配置.可以配置的各种选项通过带有CONFIG前缀的表示符来表示.这些配 置项要么可以二选一,要么可以三选一.二选一就是yes or no.三选一可以有yes,no和module.module意味着该配置被选定了,但编译的时候这部分功能的实现代码是以模块的形式生成.驱动程序一般 是三选一的.

内核提供了各种不同的工具来简化内核配置.make config是一个字符界面下的命令行工具,该工具会挨个遍历所有配置,要求用户进行选择,耗时巨大.make menuconfig和make xconfig都是图形界面工具,都对配置项进行了分类存放,其中后者基于X11,支持鼠标.这里我们采用第二种工具make menuconfig

[root@localhost uClinux-dist]# make menuconfig

注意:

1.是在uClinux-dist目录下;否则报报错:

make: *** 没有规则可以创建目标“menuconfig”。 停止。

2.如果是在终端窗口执行的话,要保证窗口的大小,如果窗口过小,则会显示出错信息:]

Your display is too small to run Menuconfig!

It must be at least 19 lines by 80 columns.

You have not saved your config, please re-run make config

make: *** [menuconfig] 错误 1

执行后在终端显示uClinux v3.1.0 Configuration窗口,主要使用[Y],[N],[M],Enter,和方向键.4个主菜单项

│ │ Vendor/Product Selection ---> │ │

│ │ Kernel/Library/Defaults Selection ---> │ │

│ │ --- │

│ │ Load an Alternate Configuration File │ │

│ │ Save Configuration to an Alternate File

首先使用方向键选择 "制造商/产品 选择"选项,回车进入下级菜单,uClinux-armsys-050101.tar.gz已经默认了Samsung和44b0x,所以我们可以直接退回到上级目录.

选中"内核/库/默认 选择",回车进入这个菜单,看到

│ │ --- Kernel is linux-2.4.x │ │

│ │ (uClibc) Libc Version │ │

│ │ [ ] Default all settings (lose changes) │ │

│ │ [ ] Customize Kernel Settings (NEW) │ │

│ │ [ ] Customize Vendor/User Settings │ │

│ │ [ ] Update Default Vendor Settings │ │

第一行内核选择了Linux2.4系列,uClinux-armsys-050101.tar.gz只提供了这一唯一选项.

第二行是c库的选择

│ │ ( ) uC-libc │ │

│ │ (X) uClibc │ │

默认是uClibc,它是uC-libc的派生物,能更好的支持标准c.如果要将c库更改为uC-libc,方向键+回车就可以了,自动退回到上级菜单.

第三行不作改变,所有配置项都取默认值.

第四行定制内核设置,如果需要可以用方向键移动到此菜单项按[Y],在[ ]中显示*.

第五行是定制制造商/用户选项设置,选择方法与定制内核完全一致

第六行更新默认的制造商设置

make menuconfig执行结束后,自动将配置结果保存为.config文件,并没有将前一次配置结果丢弃,备份为.config.old文件(.文件是Linux的隐藏文件,可以用ls -a查看 ).

下面开始对uClinux源代码包进行编译,步骤如下:

1.[root@localhost uClinux-dist]#make dep

寻找代码之间的倚赖关系(在内核2.6系列以后自动维护代码间倚赖关系,以前的这一步必需)

2.[root@localhost uClinux-dist]#make clean(可选步骤)

清除构造内核时生成的所有目标文件,模块文件和一些临时文件

3.[root@localhost uClinux-dist]#make lib_only

编译库文件

4.[root@localhost uClinux-dist]#make user_only

编译用户应用程序文件

5.[root@localhost uClinux-dist]#make romfs

生成romfs文件系统

6.[root@localhost uClinux-dist]#make image

生成内核映象文件

7.[root@localhost uClinux-dist]#make

通过各个文件夹中的Makefile文件进行编译

其中除了make romfs和make image两步较快外,其他各步都需要一段时间的执行.

编译成功后会在当前目录(/uClinux-dist)看到images文件夹,里面有两个内核文件image.rom和image.ram,另外还有一个img文件romfs.img.

3.1.5 当然这是极顺利的内核编译,在编译uClinux难免有错误出现,现总结如下:

1.如果在内核定制的时候选的c库是uC-libc则一路编译下来几乎没有问题,当执行到make image这一步时会出现两个错误:

arm-elf-objcopy: /home/uClinux-dist/linux-2.4.x/linux: ?????????

make[1]: *** [image] 错误 1

make[1]: Leaving directory `/home/uClinux-dist/vendors/Samsung/44B0'

make: *** [image] 错误 2

这是因为第一次编译时还没有romfs.o,所以出错;等romfs.o编译好以后,如果再进行内核编译,就不会出现这个错误了.它完全不影响内核的编译,可以不必理会这个错误,继续下一步.

2.如果在内核定制时选的c库是uClibc,那么当编译进行到make user_only时会出现以下错误:

login.elf2flt: In function `main':

/home/uClinux-dist/user/login/login.c:168: undefined reference to `crypt_old'

collect2: ld returned 1 exit status

make[2]: *** [login] 错误 1

make[2]: Leaving directory `/home/uClinux-dist/user/login'

make[1]: *** [all] 错误 2

make[1]: Leaving directory `/home/uClinux-dist/user'

make: *** [user_only] 错误 2

这是由于对crypt_old的未定义引用而引起报错,打开/home/uClinux-dist/user/login路径下的login.c文件会看到这么一段条件编译:

#ifdef OLD_CONFIG_PASSWORDS

#include <crypt_old.h>

#endif

crypt_old ()正是定义在crypt_old.h文件中,所以我认为这是没有设置OLD_CONFIG_PASSWORDS的缘故.尝试着注释掉这个条件编译,直接 将头文件crypt_old.h包含进来,包括同一目录下的passwd.c,再进行用户应用程序文件的编译,本以为这样可以解决问题的,但编译结果还是 报错.(疑问:OLD_CONFIG_PASSWORDS定义在哪个文件中?把它设成yes能否解决问题?)

解决方法一.

编译之前,进入/uClinux-dist/user,更改其中的Makefile文件,加上一句

LIBCRYPT +=-lcrypt_oldz

再编译,正确结束.

解决方法二.

在内核配置时选择

[*] Customize Vendor/User Settings

定制用户选项设置,在其主菜单里进入Core Applications一项,去掉对login和old password的选择,然后编译通过.

如果修改过用户配置,去http://www.hzlitai.com.cn/download/linux/config_user下载配置文件config_user,放到/uClinux-dist/config目录下覆盖原来的文件就还原到原来的设置.

3.2.1 如果手头uClinux的源代码是uClinux-dist-20040408.tar.gz版本,则还需要下载补丁uClinux-20040801- ARMSYS.patch(http://www.hzlitai.com.cn/download/default.asp)

首先解压源代码到/home,将补丁uClinux-20040801-ARMSYS.patch拷贝到/home/uClinux-dist.运行补丁程序

[root@localhost uClinux-dist]# patch -p1<uClinux-20040408-ARMSYS.patch

一系列文本行飞速闪过,最后停留在提示

...

Hunk #1 FAILED at 5.

Hunk #2 FAILED at 40.

Hunk #3 FAILED at 187.

3 out of 3 hunks FAILED -- saving rejects to file Makefile.rej

patching file linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in

Hunk #1 succeeded at 63 (offset 4 lines).

can't find file to patch at input line 16504

Perhaps you used the wrong -p or --strip option?

The text leading up to this was:

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

|

|diff -Naur uClinux-dist/vendors/Samsung/44B0/Makefile vendors/Samsung/44B0/Makefile

|--- uClinux-dist/vendors/Samsung/44B0/Makefile 2004-04-08 08:27:25.000000000 +0800

|+++ uClinux-dist/vendors/Samsung/44B0/Makefile 2004-08-01 02:43:50.000000000 +0800

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

File to patch:

这是由于源代码uClinux-dist/vendors/Samsung/路径下的文件夹名是4510B,而不存在44B0这个文件夹,所以报错.解决办法很简单,直接将4510B改名成44B0就OK了.

[root@localhost uClinux-dist]# mv vendors/Samsung/4510B vendors/Samsung/44B0

也可以根据补丁文件的描述自己手动地改写源代码,这样就不需要再打补丁了.

接下来就是代码的编译了.

4.内核的下载,烧录

在下载内核之前确保板子上已经烧录了引导装载程序bootloader,可以根据超级终端的显示来判断,如果出现了

...

1.Download code to SDRAM.

2.Download code to SDRAM & Nandflash.

3.Burn flashROM.

4.Copy code from flashROM to SDRAM.

5.Run at specify address.

6.Run code in Nandflash.

7.Start uClinux.

8.Format Nandflash.

9.Test hardware

这9个选项,说明已经有bootloader烧录到板子了,否则还要进行bootloader的烧录.

4.1bootloader.bin的烧录

烧录方法一:使用fluted烧录工具

烧录步骤

S1.连线.使用并口线和20针排线,通过JTAG模块,连接主板(开发板)和宿主机主板并口

S2.打开主板电源,运行JTAG.exe

S3.将bootloader.bin拷贝到programmer目录下,运行F.bat(Win2000 or XP运行F_2000xp.bat),开始烧录.

Fluted烧录分三个过程:擦除,写入,校验.如果没有报错,则烧录成功.可以按复位键,观察超级终端显示.

烧录方法二:使用flashprgm工具

它是一个工程文件,需要在ADS或SDT中编译运行.其优点是速度快.

在SDT中的烧录步骤:

S1.连接 jtag口,编译工程,启动ADW

S2.菜单|file|get files...,填写地址0xc200000,打开bootloader.bin,ADW就开始下载

S3.下载完成后点工具栏上(GO)图标执行flashprgm程序,开始烧录.

4.2下载image.ram到开发板

uClinux的运行有两种模式:一种是用USB或Xmodem下载内核映象文件到SDRAM指定位置,直接运行;另一种是先将内核压缩文件烧录到flashROM,再从flashROM解压缩到SDRAM开始运行.

将image.ram下载到开发板的步骤:

S1.开发板上电,用USB供电就可以了(反正需要USB下载器);启动JTAG.exe,打开超级终端

S2.在bootloader的9个选项中选择功能项1

S3.根据超级终端提示输入下载地址,默认是0xc8000,所以如果不用其它地址的话可以直接按回车键

S4.提示使用哪种下载工具,USB下载器orXmodem,选择前者按[U],后者按[X]

S5.按下[U],出现提示信息:

USB Interface is active!

You can use USBdownload.exe to download *.bin file!

这样就可以开始使用USB下载器进行程序下载了

提示信息也可能是这样的

...(以前看到过,具体什么忘了)failed!

可以按复位键重启bootloader,基本可以解决问题

注意:在使用USB下载器地时候最好断开jtag口.

S6.USB下载器的使用.菜单|file|open file...,先选择要下载的文件,它提供了三种格式的文件:.bin,.txt,还有.ram,然后点击主界面上的"下载文件"按钮开始下载,有提示信息显示和进度条变化.这里有两个问题:

1.如果直接选择image.ram,会发现它的大小只有几十k,而且到下一步启动uClinux时就死机了,所以我们将.ram文件改成.bin文件;

2.下载imageram.bin文件并不是每一次都可以成功,有时可能提示超时,那就多试几次(具体原因再作了解)

S7.下载成功后,选择功能项5,从指定位置运行程序,因为我们需要地址0xc8000,直接回车就可以了,这样就可以看到uClinux的启动画面了

4.3烧录image.rom到主板

image.rom是image.ram的压缩版本.

烧录步骤:

S1.复位开发板.选功能项1,输入地址0xc200000,回车

S2.USB下载器下载bootloader.bin(可以在光盘找到)

S3.下载成功后,再次选择功能项1,输入地址0xc220000,回车

S4.USB下载器下载imagerom.bin

S5.下载成功后,还是选择功能项1,输入地址0xc8000,回车

S6.USB下载器下载flashprgm目录下的44bapp.bin

S7.下载成功后,选功能项5,从指定位置0xc8000运行程序

S8.flashprgm开始运行,超级终端显示询问是否开始烧录,按[Y],开始烧录,可以看到开发板上绿色发光管的变化.烧录完成提示是否再次烧录,回答[N]

S9.复位开发板,输入7,运行uClinux

可以看到启动界面:

...

Load image.rom...

Start uClinux

Uncompressing Linux.............................................................Linux version 2.4.24-uc0 (root@localhost) (gcc version 2.95.3 20010315 (release5Processor: Samsung S3C44B0X revision 0

Architecture: S3C44B0X

On node 0 totalpages: 2048

zone(0): 0 pages.

zone(1): 2048 pages.

zone(2): 0 pages.

Kernel command line: root=/dev/rom0 init=/linuxrc

Calibrating delay loop... 31.84 BogoMIPS

Memory: 8MB = 8MB total

Memory: 6044KB available (1799K code, 170K data, 44K init)

Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)

Inode cache hash table entries: 512 (order: 0, 4096 bytes)

Mount cache hash table entries: 512 (order: 0, 4096 bytes)

Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)

Page-cache hash table entries: 2048 (order: 1, 8192 bytes)

POSIX conformance testing by UNIFIX

Linux NET4.0 for Linux 2.4

Based upon Swansea University Computer Society NET3.039

Initializing RT netlink socket

Starting kswapd

ttyS0 at I/O 0x1d00000 (irq = 3) is a S3C44B0

ttyS1 at I/O 0x1d04000 (irq = 2) is a S3C44B0

ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)

Last modified Nov 1, 2000 by Paul Gortmaker

NE*000 ethercard probe at 0x8000000: 52 54 ab 12 34 56

eth0: NE1000 found at 0x8000000, using IRQ 22

Blkmem copyright 1998,1999 D. Jeff Dionne

Blkmem copyright 1998 Kenneth Albanowski

Blkmem 1 disk images:

0: C0ECA80-C1D4E7F [VIRTUAL C0ECA80-C1D4E7F] (RO)

RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize

NET4: Linux TCP/IP 1.0 for NET4.0

IP Protocols: ICMP, UDP, TCP

IP: routing cache hash table of 512 buckets, 4Kbytes

TCP: Hash tables configured (established 512 bind 512)

VFS: Mounted root (romfs filesystem) readonly.

Freeing init memory: 44K

Shell invoked to run file: /etc/rc

Command: hostname Samsung

Command: /bin/expand /etc/ramfs.img /dev/ram0

Command: /bin/expand /etc/ramfs2048.img /dev/ram1

Command: mount -t proc proc /proc

Command: mount -t ext2 /dev/ram0 /var

Command: mount -t ext2 /dev/ram1 /ramdisk

Command: chmod 777 /ramdisk

Command: mkdir /var/config

Command: mkdir /var/tmp

Command: mkdir /var/log

Command: mkdir /var/run

Command: mkdir /var/lock

Command: cat /etc/motd

Welcome to

____ _ _

/ __| ||_|

_ _| | | | _ ____ _ _ _ _

| | | | | | || | _ | | | | / /

| |_| | |__| || | | | | |_| |/

| ___\____|_||_|_| |_|\____|\_/\_/

| |

|_|

For further information check:

http://www.uclinux.org/

Command: ifconfig lo 127.0.0.1

Command: route add -net 127.0.0.0 netmask 255.255.255.0 lo

Command: ifconfig eth0 192.168.253.2 netmask 255.255.255.0 up

Command:

Execution Finished, Exiting

Sash command shell (version 1.1.1)

/>

附:uClinux的通用c库:uC-libc和uClibc的区别概述

uClinux通常使用两种c库:uC-libc和uClibc.尽管它们名字近似,但有很大区别.本文是对它们不同点的快速浏览.

uC-libc是uClinux的原始c 库,它基于Linux-8086 c库,该c 库是ELKs 工程的一部分,支持m68000结构.uC-libc是一个相当全面的c 库,但它的一些API是非标准的,一些通用库例程现在已不再使用.目前它能稳定地支持m68000,ColdFire和ARM(不带MMU)结构 .其主要设计目标是小型化和轻量级.它力图符合通用标准,它的API也与绝大多数的c 库兼容,但与标准难免有出入.

uClibc是uC-libc的派生体,用来解决uC-libc存在的问题.它让所有的API都标准化(正确的类型,参数等),补充了许多缺失的例程,并 且已经移植到许多结构中.大体上讲,它通过提供glibc兼容使得应用程序移植到较小的c 库时相当得容易. 它能够应用到带虚拟存储的Linux和uClinux上.在大多数带MMU部件的平台上为使它更加紧凑,它也能够编译成共享库.uClibc支持许多处理 器:m68000,ColdFire,ARM,MIPS,v850,x86,i960,Sparc,SuperH,Alpha,PowerPC和 Hitachi 8.uClibc能更加容易地适应新的体系结构,它所支持的平台数目至今仍在增长证实了这一点.

可以根据你的需要来选择uClinux使用uC-libc或者uClibc编译环境.对m68000和ColdFire平台通常选择uC-libc, 因为它支持共享库,是这些处理器上使用最广泛的c 库.uClibc also works quite well with almost all platforms supported by the distribution.你的需要将最终决定到底选择哪一种c库.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有