微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > uClinux在S3C44B0X上的移植

uClinux在S3C44B0X上的移植

时间:11-10 来源:互联网 点击:
d 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 FAI

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top