uClinux在S3C44B0X上的移植
发布日期:2011-04-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库.