这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » uClinux,uClinux,nbsp,nbsp,porting,on,s3c

共2条 1/1 1 跳转至

uClinux,uClinux,nbsp,nbsp,porting,on,s3c44B0 uClinux移植:uClinux 2.6  po

院士
2006-09-17 18:14:16     打赏
uClinux,uClinux,nbsp,nbsp,porting,on,s3c44B0 uClinux移植:uClinux 2.6  porting on s3c44B0



关键词: uClinux     porting     s3c44B0         

院士
2006-12-22 22:43:00     打赏
2楼
uClinux 2.6  porting s3c44B0 based on uClinux-ARMsys-050101.tar.gz
荆潇影      2006.9.28
(E-mail:huazjxy@126.com)
目录:
1.检查linux 各编译工具版本
2.立宇泰2.4内核编译
3.2.6.9内核及补丁下载
4.2.6.9内核编译过程
5.结语

开发板:FSIIsc344b0 board ,CPU:SC344B0   RAM:8M  FALSH:2M 不带网卡

1.    检查linux 各编译工具版本
以root登陆linux,打开终端,使用命令gcc –v 检查下gcc的版本及是否存在.,如果不存在(我装的Redhat 9.0就遇到了这样的情况),则需要重新安装gcc.对于新手而言,去下个gcc版本再重新安装,并不简单,至少我这样的菜鸟就不会.(linux 才刚刚接触).网上搜索了下搜到篇好文章:
http://bbs.chinaunix.net/viewthread.php?tid=596499
上面提到了一种方法: (2)更好的方法就是在X-window下选“主菜单”──>;“系统设置”──>;“添加/删除应用程序”──>;“开发工具”中的gcc并安装它.
安装过程中毫无悬念,电脑会自动提醒你插入相应的安装盘.
2.立宇泰2.4内核编译
准备好uClinux-ARMsys-050101.tar.gz和ARM-elf-tools-20030314.sh
uClinux-ARMsys-050101.tar.gz解压缩,
运行解压命令:
#tar xvzf uClinux-ARMsys-050101.tar.gz
解压结束将会在/root下生成uClinux-dist目录.
2.1.安装编译环境
下面开始配置编译环境,将ARM-elf-tools-20030314.sh拷贝到/root下,运行安装:
#sh ARM-elf-tools-20030314.sh

2.2.配置和裁剪uClinux

#cd uClinux-dist
#make menuconfig
此时将出现图象界面,可以对其相应的配置和裁减.进入uClinux配置(uClinux v3.1.0 Configuration),选中”Kernel/Libarary /Defaults Selection->”.其中有两个选项要选取:内核设置和用户选项设置:
[*]Customize Kernel Settings
[*]Customize Vendor/User Settings
选中这两项,按下ESC键退出,在询问是否保存时,选择yes并回车.
终端将进入内核配置选单.我们在配置uClinux可以根据自己的需要,对相应的选项进行自由选择.

2.3.编译uClinux

按下面步骤对uClinux源码包进行编译:
make dep ……………………建立依赖关系
make clean……………………清除旧的编译结果
make lib_only………………编译库
make user_only………………编译用户程序
make romfs……………………产生romfs
make image……………………产生映象文件
make………………………………编译内核
注意事项:在上面六个步骤的编译中,不建议在 make dep后就直接make了,一般建议一步步来,make clean下可以避免网上有些朋友出现的死机现象。 在make image的过程中会出现两个错误,这个两个错误大概是交叉编译工具的某个库被复制时出的错误,没有什么大的影响,不用去管。继续下一步make编译内核。
这样就在uClinux-dist 目录下将生成三个文件:image.ram、image.rom和romfs.img就是我们用来下载和烧录的映象文件。下载烧录这些映象文件,启动和运行uClinux就OK了。因为linux环境下对中文支持很差,只能够换到windows环境下写这篇东西,不能够将一些相应指令的运行情况给Copy下来,请见谅。但我这样记忆书写的,基本没有问题。

3.2.6.9内核及补丁下载

因为2.4内核的编译,因为立宇泰的uClinux-ARMsys-050101.tar.gz补丁做的很好,基本不会出现问题,对于新学者来说,起个了解整个过程的作用这将是无比重要的。接着我们来探讨下2.6内核的移植问题。

S3C44B0 CPU 2.6内核的官方网站是http://opensrc.sec.samsung.com/, 看了网站的资料后,我们首先要做的就是下载最新的内核来试试看.其中下面的文章值得一读.
http://opensrc.sec.samsung.com/document/Getting_Familiar_with_uClinuxARM2_6.html

最新内核编译
http://opensrc.sec.samsung.com
/下载补丁linux-2.6.11.8-hsc0.patch.gz
www.kernel.org
下载linux-2.6.11.8.tar.gz.

[root@jingxiaoying]# tar zxvf linux-2.6.11.8.tar.gz
[root@jingxiaoying ]# cd linux-2.6.11.8
[root@jingxiaoyinglinux-2.6.11.8]# patch -p1 < ../linux-2.6.11.8-hsc0.patch
[root@jingxiaoyinglinux-2.6.11.8]# ARCH=ARM CROSS_COMPILE=ARM-elf- make menuconfig
[root@jingxiaoyinglinux-2.6.11.8]# ARCH=ARM CROSS_COMPILE=ARM-elf- make
CC arch/ARM/kernel/asm-offsets.s
In file included from arch/ARM/kernel/asm-offsets.c:13:
include/linux/sched.h: In function `arch_PICk_mmap_layout':
include/linux/sched.h:1174: `TASK_UNMAPPED_BASE' undeclared (first use in this function)
include/linux/sched.h:1174: (Each undeclared identifier is reported only once
include/linux/sched.h:1174: for each function it appears in.)
make[1]: *** [arch/ARM/kernel/asm-offsets.s] Error 1
make: *** [arch/ARM/kernel/asm-offsets.s] Error 2
include/asm/arch/memory.h中增加TASK_UNMAPPED_BASE定义
[root@jingxiaoyinglinux-2.6.11.8]# ARCH=ARM CROSS_COMPILE=ARM-elf- make
usr/initramfs_data.S: Assembler messages:
usr/initramfs_data.S:29: Error: Unknown pseudo-op: `.incbin'
make[1]: *** [usr/initramfs_data.o] Error 1
make: *** [usr] Error 2

这个编译器不支持.incbin的缘故, 下载新的编译器
我现在使用的是ARM-elf-tools-20030314.sh.下载新的编译器:
http://opensrc.sec.samsung.com/download/ARM-elf-tools-20040427.sh
并安装后,重新编译:

[root@jingxiaoyinglinux-2.6.11.8]# ARCH=ARM CROSS_COMPILE=ARM-elf- make
arch/ARM/mach-s3c44b0x/time.c: In function `s3c44b0x_time_init':
arch/ARM/mach-s3c44b0x/time.c:95: `gettimeoffset' undeclared (first use in this function)
arch/ARM/mach-s3c44b0x/time.c:95: (Each undeclared identifier is reported only once
arch/ARM/mach-s3c44b0x/time.c:95: for each function it appears in.)
arch/ARM/mach-s3c44b0x/time.c:99: warning: implicit declaration of function `s3c44b0x_clear_pb'
arch/ARM/mach-s3c44b0x/time.c:100: warning: implicit declaration of function `s3c44b0x_unmask_irq'
make[1]: *** [arch/ARM/mach-s3c44b0x/time.o] Error 1
make: *** [arch/ARM/mach-s3c44b0x] Error 2
[root@jingxiaoyinglinux-2.6.11.8]#

现在注释掉gettimeoffset = s3c44b0x_gettimeoffset后,编译:
[root@jingxiaoyinglinux-2.6.11.8]# ARCH=ARM CROSS_COMPILE=ARM-elf- make
CC arch/ARM/mach-s3c44b0x/driver/rtl8019.o
arch/ARM/mach-s3c44b0x/driver/rtl8019.c: In function `nic_8019_open':
arch/ARM/mach-s3c44b0x/driver/rtl8019.c:218: `MOD_INC_USE_COUNT' undeclared (first use in this function)
arch/ARM/mach-s3c44b0x/driver/rtl8019.c:218: (Each undeclared identifier is reported only once
arch/ARM/mach-s3c44b0x/driver/rtl8019.c:218: for each function it appears in.)
arch/ARM/mach-s3c44b0x/driver/rtl8019.c:216: warning: unused variable `j'
arch/ARM/mach-s3c44b0x/driver/rtl8019.c: In function `nic_8019_stop':
arch/ARM/mach-s3c44b0x/driver/rtl8019.c:286: `MOD_DEC_USE_COUNT' undeclared (first use in this function)
arch/ARM/mach-s3c44b0x/driver/rtl8019.c: In function `nic_8019_start_xmit':
arch/ARM/mach-s3c44b0x/driver/rtl8019.c:296: warning: unused variable `priv'
make[2]: *** [arch/ARM/mach-s3c44b0x/driver/rtl8019.o] Error 1
make[1]: *** [arch/ARM/mach-s3c44b0x/driver] Error 2
make: *** [arch/ARM/mach-s3c44b0x] Error 2
[root@jingxiaoyinglinux-2.6.11.8]#

注释掉MOD_DEC_USE_COUNT和MOD_INC_USE_COUNT

GEN .version
CHK include/linux/compile.h
UPD include/linux/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_flush_user_cache_range'
arch/ARM/mm/built-in.o(.text+0x1480): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_flush_user_cache_all'
arch/ARM/mm/built-in.o(.text+0x1480): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_coherent_kern_range'
arch/ARM/mm/built-in.o(.text+0x148c): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.init.data+0x0): multiple definition of `v3_cache_fns'
arch/ARM/mm/built-in.o(.init.data+0x70): first defined here
/usr/local/bin/ARM-elf-ld.real: Warning: size of symbol `v3_cache_fns' changed from 36 in arch/ARM/mm/built-in.o to 32 in arch/ARM/mach-s3c44b0x/built-in.o
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_dma_flush_range'
arch/ARM/mm/built-in.o(.text+0x1490): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_flush_kern_cache_all'
arch/ARM/mm/built-in.o(.text+0x1480): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_flush_kern_dcache_page'
arch/ARM/mm/built-in.o(.text+0x1490): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_dma_inv_range'
arch/ARM/mm/built-in.o(.text+0x1490): first defined here
arch/ARM/mach-s3c44b0x/built-in.o(.text+0x170): In function `v3_dma_clean_range':
: multiple definition of `v3_dma_clean_range'
arch/ARM/mm/built-in.o(.text+0x1498): first defined here
kernel/built-in.o(.text+0x1cfb4): In function `kallsyms_expand_symbol':
: undefined reference to `kallsyms_names'
kernel/built-in.o(.text+0x1cfb8): In function `kallsyms_expand_symbol':
: undefined reference to `kallsyms_token_index'
kernel/built-in.o(.text+0x1cfbc): In function `kallsyms_expand_symbol':
: undefined reference to `kallsyms_token_table'
kernel/built-in.o(.text+0x1d020): In function `kallsyms_get_symbol_type':
: undefined reference to `kallsyms_names'
kernel/built-in.o(.text+0x1d024): In function `kallsyms_get_symbol_type':
: undefined reference to `kallsyms_token_index'
kernel/built-in.o(.text+0x1d028): In function `kallsyms_get_symbol_type':
: undefined reference to `kallsyms_token_table'
kernel/built-in.o(.text+0x1d07c): In function `get_symbol_offset':
: undefined reference to `kallsyms_markers'
kernel/built-in.o(.text+0x1d080): In function `get_symbol_offset':
: undefined reference to `kallsyms_names'
kernel/built-in.o(.text+0x1d0fc): In function `kallsyms_lookup_name':
: undefined reference to `kallsyms_num_syms'
kernel/built-in.o(.text+0x1d100): In function `kallsyms_lookup_name':
: undefined reference to `kallsyms_addresses'
kernel/built-in.o(.text+0x1d300): In function `kallsyms_lookup':
: undefined reference to `kallsyms_addresses'
kernel/built-in.o(.text+0x1d318): In function `kallsyms_lookup':
: undefined reference to `kallsyms_num_syms'
kernel/built-in.o(.text+0x1d450): In function `get_ksymbol_mod':
: undefined reference to `kallsyms_num_syms'
kernel/built-in.o(.text+0x1d4a4): In function `get_ksymbol_core':
: undefined reference to `kallsyms_addresses'
kernel/built-in.o(.text+0x1d570): In function `update_iter':
: undefined reference to `kallsyms_num_syms'
make: *** [.tmp_vmlinux1] Error 1
[root@jingxiaoyinglinux-2.6.11.8]#

一直不太明白上面的错误,实在搞不定了.而且后面试了其他的方法,但都有不定的错误.实在不行,于是另寻办法.

3.2.2.6.9内核

经过网上资料的查询和阅读,还是觉得2.6.9内核比较容易,因为网站上有2.6.9的uclinux补丁.具体是:
http://opensrc.sec.samsung.com/download/linux-2.6.9-uc0-hsc0.patch.gz

因此我们从www.kernel.org
上下载了linux-2.6.9.tar.bz2.
从www.uclinux.org
上下载了linux-2.6.9-uc0.patch,这样呢我们就有了3个文件.

-rw-r--r-- 1 root root 36261440 2004-10-19 linux-2.6.9.tar.bz2
-rw-r--r-- 1 root root 357214 2004-11-23 linux-2.6.9-uc0-hsc0.patch
-rw-r--r-- 1 root root 1231190 2004-10-28 linux-2.6.9-uc0.patch


然后我们从头开始做. 另一个需要的就是uclinux-dist包,我们使用uClinux-ARMsys-050101.tar.gz,因为我们用这个版本已经可以跑2.4内核了.

4.2.6.9内核编译过程
开始行动,将下载的补丁和2.6.9内核包全部解压缩,命令也好,手动也行。在/root下建一个新的文件夹uC44B0将以前2.4内核移植时的uClinux-dist通过指令:
#cp uClinux-dist&nbsp;&nbsp;uC44B0
#cd uC44B0
#rm rf linux-2.6.x//此指令的作用是在uClinux下建一个linux-2.6.x 的文件夹。也可以手动实现。
#mv linux-2.6.9&nbsp;&nbsp;linux2.6.x//将linux2.6.9内核包给放到linux-2.6.x目录下。
#cd linux-2.6.x
#patch –p1 <.../../linux-2.6.9-uc0.patch
#patch –p1 <.../../linux-2.6.9-uc0-hsc0.patch
按照2.4内核的编译方法,增加Vendor 的文件:
#cd ..//回到uC44B0目录
#cp inux-2.6.x/arch/ARMnommu/configs/s3c44b0x_defconfig&nbsp;&nbsp;uC44b0/uClinux-dist /Vendors/samsung44b0/config.linux-2.6.x//此指令的效果是将linux-2.6.x下的s3c44b0x_defconfig给复制到uClinux-dist 下的vendors/sansung44b0下。建议手动操作,要用指令先手动熟悉下路径。

这样前面的准备工作也做的差不多了,开始make menuconfig,进入配置界面,这时做法和2.4内核编译时相同。
后面的步骤也一致。
按下面步骤对uClinux源码包进行编译:
make dep ……………………建立依赖关系
make clean……………………清除旧的编译结果
make lib_only………………编译库
make user_only………………编译用户程序
make romfs……………………产生romfs
make image……………………产生映象文件
make………………………………编译内核
注意事项也相同,在上面六个步骤的编译中,不建议在 make dep后就直接make了,一般建议一步步来,make clean下可以避免网上有些朋友出现的死机现象。 在make image的过程中会出现两个错误,这个两个错误大概是交叉编译工具的某个库被复制时出的错误,没有什么大的影响,不用去管。继续下一步make编译内核。
最终将在uClinux-dist/images/下出现三个文件:image.ram、image.rom和romfs.img就是我们用来下载和烧录的映象文件。下载烧录这些映象文件,启动和运行uClinux就OK了。


5.结语
当然这仅仅只做出了第一步,我这个移植步骤也是参考了网上的一篇文章弄的,但那位大虾用的是Micetek EV44B0-II board的uClinux 软件包,他后来走了一些弯路,但也解决了,当然锻炼了能力。我这样一下子编译成功,不能够不说是运气,当然立宇泰的补丁做的好也是很重要的因素。当然针对那些想要锻炼自身的高手,建议自己找个没有别人打过补丁的包,自己重新开发。对于新手来说,按照我的方法将少走一些弯路。当然下面的工作就是进行深入的一些开发了,相应大家会成功的。我们一起努力吧。

参考文献:
[1] S3C44B0开发板移植内核2.6 uclinux记录&nbsp;&nbsp;&nbsp;Sam Fei (email: samfei@163.com)
[2] uclinux在ARMSYS上的使用说明书.pdf&nbsp;&nbsp;&nbsp;&nbsp;杭州立宇泰公司

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;huazjxy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006-9-28于杭州

1: 郁闷没有人理,自己顶下:( 2: 好文!兄弟正想如此! 3: xiexiexie xie zhichi! 4: 顶一个

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]