uClinux2.6入门 | 原文出自:http://adam.kaist.ac.kr/~hschoe/Get...inuxARM2_6.html
作者:Hyok S.Choi < hyok.choi@samsung.com >
翻译:renbagshoes < renbagshes12@yahoo.com.cn >
转载请注明www.linuxsir.org ,谢谢!
一、使用uClinux/ARM 2.6的原因?
为什么你要使用uClinux?有很多的理由使uClinux做为你的嵌入式操作系统。其中大部分认为uClinux有以下好处:
轻便
你可以编译linux2.6的内核得到一个300k以下的内核镜像,它包括终端和一些基本的设备驱动以及只读文件系统。并且flat格式的二进制zImage和应用程序要比linux传统使用的ELF二进制小30%--50%,由于使用了较少的标准的C和C++库。
XIP(execution in place)
你能通过XIP来在一个较小的RAM时执行你的内核镜像,甚至是应用程序。它能帮助你快速的启动,尽管flash的存取时间或是rom启动镜像足够快以及有足够的缓存大小。(如果我们想找到它们最优化的平衡点,可以交换两者之间这些变量。)
便宜
MMU(内存管理单元)核心大小大约占典型的ARM SoC(System-on-Chip单片机)wafer(晶体)的30%。在典型的网络和嵌入式系统里有一半以上的应用程序不需要MMU。甚至如果只有一个CPU的许多RTOS(实时操作系统)在默认情况下也不使用MMU。
完全的Linux应用程序接口
除少数情况外,你可以在uClinux平台上完全使用Linux应用程序接口。你能在uClibc里使用多线程以及使用标准的系统调用。在用户盘里的uClinux发布包里有大量的应用程序被移植到了uClinux系统上。
Easiar to adapt
在uClinux性能里有一个有趣的特性,是应用程序可以访问整个系统,包括设备里的寄存器,with a bit of wrapper ,我们能制作固件代码做为无格式的应用程序运行在 uClinux上!当然,你能加一些设备驱动和系统调用来调用以及使用许多打开的Ips在混和的旧的固件代码里。如果你计划移动你的固件代码到 linux,但你没有熟悉的linux系统程序,uClinux是一个很好的出发点
完全的linux2.6内核的特性
尽管uClinux很小,但它支持linux2.6内核约定的全部的特性,包括内核优先级特性以及许多的文件系统,设备驱动。为linux约定设备驱动端口是容易实现的。几乎所有的代码不需要改变就可以编译,除了从虚拟地址到物理的内存镜像外。
注:上面的部分由于涉及的概念太多,翻译的不大好,请大家指正,谢谢。
二、初次编译uClinux/ARM2.6指南
如果你决定使用uClinux做为开发环境,那么下面的部分将会让uClinux运行在你的linux PC机上:
1、获得uClinux发布包
一个最容易得到uClinux的发布包的方法是直接访问uClinux.org站点:
http://www.uclinux.org/pub/uClinux/dist/
注意这里发布的内核版本可能不是最新的,但你能找到一个最新的补丁以及从kernel.org站点上找一个对应的linux内核版本来制作一个最新的 uClinux内核。此时(2004年05月25日)可从“http://www.uclinux.org/pub/uClinux/dist”获得最新的发布包的版本是uClinux-dist.20040408.tar.gz。如果你对编译软件不是很熟悉,那么根据这个指南你将会很容易的使用这个分布包来制作你的uClinux内核或是升级它到最新的版本。
2、获得最新的内核及补丁
你能到这里找到最新的uClinux/ARM内核补丁:
http://adam.kaist.ac.kr/~hschoe/
在下载的部分,你将会找到“linux-2.6.x-hscx.patch.gz”最新的链接,以及原始的内核包:
http://adam.kaist.ac.kr/~hschoe/dow...5-hsc2.patch.gz
和 http://www.kernel.org/pub/linux/ker...x-2.6.5.tar.bz2
3、ARM-ELF工具链
从linux2.6内核代码使用了一些更新的binutils新特性以来,你需要一个比uclinux.org站点上更新的ARM-ELF工具链来编译内核。你能够从上面的与下载内核和补丁相同的download部分找到最新的工具链,就在当前的链接下:
http://adam.kaist.ac.kr/~hschoe/dow...ols-20040427.sh
4、硬件平台或是一个ARMulator(ARM仿真)
当然你需要一个平台来运行uClinux内核,请首先看一下注意事项里有那些平台被支持。即使你不能找到适用于你的平台,或是你没有任何的硬件平台,那你也能在你的linux PC机上运行这个内核:使用ARMulator(ARM仿真)。ARMulator是一个以GDB调试器为基础的仿真,这个仿真完全支持Atmel AT91x和arm7tdmi EB01。ARMulator的主页在这:
http://www.uclinux.org/pub/uClinux/utilities/armulator/
你也能直接从这里下载:
http://www.uclinux.org/pub/uClinux/...gdb-5.0.tar.bz2(原始gdb-5.0包)
http://www.uclinux.org/pub/uClinux/...021127.patch.gz(gdb-5.0所依赖的补丁)
如果你想在ARMulator上运行内核的ramdisk(虚拟磁盘),那么你就需要从这下载另外一个软件包:
http://adam.kaist.ac.kr/~hschoe/dow...040412.patch.gz
5、如果你是初次编译这些发布包的话,OK!从这我们将会一步一步的进行
(现在把上面所下载的软件包都发在/root/incoming目录里)
(On this guide, the downloaded files are gathered on ~/incoming
and the ARMulator is used for platform to run on.)
6、安装工具链
以root用户来执行arm-elf-tools-20040427.sh,像这样:
[root@hyoklinux /]#/bin/sh ~/incoming/arm-elf-tools-20040427.sh
注:~是你的root用户目录,当然也可以选择别的目录,但这取决于你的第5步所设置的目录。
你将看到被安装文件的列表,这个工具链的可执行的二进制文件被安装到了/usr/local/bin目录里,所以你的环境变量的搜索路径应包括这个目录,通常使用的发行版像redhat等已经将这个路径包括在$PATH变量里,可以用下面的命令查看一下:
[root@hyoklinux /]#echo $PATH
7、释放uClinux发布包
在一个有2GB空间的目录里来释放uclinux发布包
[root@hyoklinux /]# tar -zxvf ~/incoming/uClinux-dist-20040408.tar.gz
让我们看看uClinux-dist目录里有什么文件
[root@hyoklinux /]# cd uClinux-dist/
[root@hyoklinux uClinux-dist]# ls -al
total 104
drwxr-xr-x 15 1000 users 4096 Apr 8 09:27 .
drwxr-xr-x 28 root root 4096 Apr 27 20:32 ..
-rw-r--r-- 1 1000 users 18007 Apr 8 09:13 COPYING
drwxr-xr-x 3 1000 users 4096 Apr 8 09:13 document.tion
-rw-r--r-- 1 1000 users 9305 Apr 8 09:13 Makefile
-rw-r--r-- 1 1000 users 4934 Apr 8 09:13 README
-rw-r--r-- 1 1000 users 1743 Apr 8 09:13 SOURCE
drwxr-xr-x 2 1000 users 4096 Apr 15 15:19 bin
drwxr-xr-x 3 1000 users 4096 Apr 8 09:27 config <-- 为本地用户提供的配置文件以及其它的
drwxr-xr-x 11 1000 users 4096 Apr 8 09:27 freeswan <-- IPsec的实现
drwxr-xr-x 68 1000 users 4096 Apr 8 09:23 glibc <-- GNU C库
drwxr-xr-x 18 1000 users 4096 Apr 8 09:28 lib <-- 许多移植到uClinux的库,包括uC-libc.
drwxr-xr-x 15 1000 users 4096 Apr 8 09:27 linux-2.0.x <-- uClinux 2.0.x kernel
drwxr-xr-x 16 1000 users 4096 Apr 8 09:27 linux-2.4.x <-- uClinux 2.4.x kernel
drwxr-xr-x 18 1000 users 4096 Apr 8 09:27 linux-2.6.x <-- uClinux 2.6.x kernel
drwxr-xr-x 3 1000 users 4096 Apr 8 09:26 tools <-- 安装romfs提供的程序以及其它的
drwxr-xr-x 17 1000 users 4096 Apr 8 09:27 uClibc <-- uClibc可从uclibc.org找到,与uC-libc不同.
drwxr-xr-x 174 1000 users 4096 Apr 8 09:27 user <-- the“userland”被移植的应用程序
drwxr-xr-x 44 1000 users 4096 Apr 8 09:27 vendors <-- 每一个vendor/models的配置文件
注:vendor(计算机销售商) models(模型)
8、用这些文件制作出一个新的linux-2.6.x内核
在20040408发布包目录里的linux-2.6.x是由内核“linux-2.6.2”和补丁“linux-2.6.2-uc0”生成的。而 uClinux/ARM2.6需要更新的内核版本(如linux-2.6.5 + linux-2.6.5-hsc2.patch)。
[root@hyoklinux uClinux-dist]# tar -jxvf ~/incoming/linux-2.6.5.tar.bz2
现在我们得到了整个的linux-2.6.5源代码,以及所需的内核补丁。
[root@hyoklinux uClinux-dist]# gzip -dc ~/incoming/linux-2.6.5-hsc2.patch.gz | patch -p0
运行上面的命令后,你将会看到一些补丁目录里包含有“armnommu”的字符串的代码。你可以在你的uClinux 2.6内核里使用“linux-2.6.5”的目录名,这不是必需的。然而,我觉得使用“linux-2.6.x”这个名字会更方便些。
因此你现在不需要原来uClinux目录里的linux-2.6.x(即那个linux-2.6.2-uc0),执行:
[root@hyoklinux uClinux-dist]# rm -rf linux-2.6.x/
然后我们将重命名更新补丁的内核目录名为“linux-2.6.x”,执行:
[root@hyoklinux uClinux-dist]# mv linux-2.6.5 linux-2.6.x
9、确定配置文件
当前的uClinux发布包不包含有关于uClinux/ARM2.6完整的配置文件。我们需要简单的修改一下,ARMulator默认的配置文件在vendors/GDB/ARMulator目录下面。我们能像下面这样来修改它:
[root@hyoklinux uClinux-dist]# cp linux-2.6.x/arch/armnommu/configs/GDB_ARMulator_defconfig \ vendors/GDB/ARMulator/config.linux-2.6.x
为了rootfs能使用ramdisk,我们需要修改一下配置目录里的“rc”这个文件,这样就可以使用1号的ramdisk设备了。
(原文:Since we’ll use a ramdisk for the rootfs, we need to fix the “rc” in the
configuration directory to use ramdisk device number 1)
像下面这样编辑vendors/GDB/ARMulator/rc这个文件:
[root@hyoklinux uClinux-dist]# vim vendors/GDB/ARMulator/rc
hostname GDB-ARMulator
/bin/expand /etc/ramfs.img /dev/ram1
mount -t proc proc /proc
mount -t ext2 /dev/ram1 /var
mkdir /var/tmp
mkdir /var/log
mkdir /var/run
mkdir /var/lock
mkdir /var/empty
cat /etc/motd
10、配置内核和安装用户应用程序
[root@hyoklinux uClinux-dist]# make menuconfig
首先在“Main Menu”找到“Vendor/Product”所在行,选择“GDB/ARMulator”,像这样:
--- Select the Vendor you wish to target
(GDB) Vendor
--- Select the Product you wish to target
(ARMulator) GDB Products
你可以按’esc’键或是“Exit”按钮返回主菜单。
在主菜单选择“Kernel/Library/Defaults选项”。
选择内核版本为“linux-2.6.x”,以及选择使用的库为“uClibc”。
切换到下面的菜单:
(linux-2.6.x) Kernel Version
(uClibc) Libc Version Default all settings (lose changes) (NEW) Customize Kernel Settings (NEW) Customize Vendor/User Settings (NEW) Update Default Vendor Settings (NEW)
你可以按’esc’键或是“Exit”按钮返回主菜单。
第一个“default all settings”选项是vendors目录里默认的配置文件。第二个“Customize kernel settings”选项能让我们编辑内核配置。第三个“Customize Vendor/User settings”选项是为了生成romfs.img所需要配置应用程序和库。最后一“Update Default Vendor settings”项,你对内核的改变以及你所配置的应用程序将保存在vendors/product的目录里。
你可以按’esc’键或是“Exit”按钮返回主菜单,然后保存并退出!
11、配置内核
如果你确认了上面的配置过程,那么你可以得到一个配置文件。然而我们需要改变初始的ramdis的大小。因为romfs.img文件的大小在默认情况下大约是771KB。在“一般设置(General setup)”菜单里,有“Default kernel command string”这一项,这样改变它:
root=/dev/ram0 initrd=0x01300000,800K keepinitrd
你可以按’esc’键或是“Exit”按钮返回主菜单,然后保存并退出!
程序/库的配置
在这个菜单上,我们不需要修改任何的设置,看一下配置按“exit”保存并退出!
现在我们运行下面的这步来进行整个的编译过程:
[root@hyoklinux uClinux-dist]# make
注:如果是编译linux-2.4.x或是以下的版本的内核,你在“make”之前还需要“make dep”这一步,但是在编译linux-2.6.x的内核时就不需要了。
这一步将编译整个内核和uclibc(uClinux的系统库),用户程序,以及制作romfs.img文件。
下面是结果,你可以像下面这样查看image目录里的文件:
|
|