您的位置 首页 观点

uClinux在S3C44B0X上的移植

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

前期预备:
装有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
#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一系列文本行飞速闪过,终究停留在提示

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).
cant 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库.

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/275573.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部