免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 737 | 回复: 0
打印 上一主题 下一主题

(转帖)uClinux在S3C44B0X上的移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-01 22:35 |只看该作者 |倒序浏览

前期准备:
装有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
    附: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库.


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/34944/showart_269227.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP