原创 uclinux内核建立过程

2007-4-2 14:09 2966 4 5 分类: MCU/ 嵌入式

uClinux移植概述
作者:姜江
E-mail:jznsmail@tom.com
Blog:http://blog.csdn.net/jznsmail


1.建立开发环境
    作为uClinux系统的移植和开发的主机最好使用Linux操作系统,如果选择Windows平台作为开发平台则需要Cygwin软件包的支持。在这里我们选用的开发平台是Fedora Core 2,内核版本为2.4.x。在进行uClinux的移植和开发之前,我们需要建立系统的交叉编译环境,因为做为主机我们使用的是IA32体系结构的处理器,而开发板我们才用的是ARM体系结构的处理器。ARM平台的交叉编译工具可以从uClinux的官方网站获得(www.uclinux.org)。在这里我们采用的是arm-elf-tools-20030314.sh,该文件是一个自解压文件,可以直接执行程序安装。
    #./arm-elf-tools-20030314.sh
    如果不能执行该文件,则需要修改一下文件的可执行属性
    #chmod 755 arm-elf-tools-20030314.sh
    然后再执行程序的安装。可执行文件按会被默认安装在/usr/local/bin目录下。


2.编译uClinux内核
    uClinux是一款支持无MMU单元的嵌入式操作系统,我们可以从其官方网站获取最新版本的内核文件(www.uclinux.org)。
    我们将下载的uClinux内核文件放入我们的工作目录(/home/jelly/kernel/),然后使用tar工具解压内核文件。
    $cd /home/jelly/kernel/
    $tar xvzf uClinux-dist-200xxxxx.tar.gz
    经过一段时间的解压后将在工作目录下会生成uClinux-dist文件夹。
    在编译内核之前我们首先要做的是配置内核,常用的配置方式有如下几种:
    make xconfig - X Windows图形界面的配置选项
    make menuconfig - Console图形界面的配置选项
    make config - 命令接口的配置选项
    在这里需要注意的是uClinux是不支持loadable modules的,因此应该取消对该模块的支持。


    $cd uClinux-dist/
    $make menuconfig


    配置你需要的选项,比如处理器类型,开发板类型,内核版本等。配置好之后选择Saving and Exiting保存退出。


    编译uClinux内核的常用选项有:
    make distclean
    该命令将清除以前编译时候产生的文件,包括.config文件,所有目标文件以及内核映象文件。


    make clean
    该命令与make distclean相似,也是清除之前编译时候产生的文件


    make dep 这个只需要在第一次编译的时候执行,为了是建立文件之间的依赖关系,make命令会根据这个依赖关系来确定哪些文件需要重新编译,哪些文件可以跳过。


    make lib_only
    编译uClibc库


    make user_only
    编译用户制定的应用程序,比如初始化进程init,bash,以及集成了很多常用工具的嵌入式软件包busybox。


    make romfs
    uClinux经常才用romfs(只读文件系统)来作为系统的根文件系统,所以首先需要将之前编译的很多应用程序以uClinux所需要的目录格式存放起来。比如将可执行文件放在bin目录下,将配置文件放在etc目录下。该命令执行后会在uClinux-dist目录下生成一个romfs的目录,并且将文件系统所需要的文件组织起来,以便之后生成fomfs的映象文件。


    make image
    生成romfs文件系统的映象文件,以及linux的映象文件。该linux的映象文件是elf格式的,是不能直接下载到开发板上执行的(里面包含了大量的调试信息,elf文件执行前的环境建立信息等内容。该文件可以使用arm-elf-objcopy工具来生成可以直接在RAM中执行的binary文件)。


    make linux
    执行该命令之后将生成linux内核文件。


    make zImage
    建立经过gzip算法压缩过的内核映象文件,通常zImage产生的内核映象文件无法超过512KB大小。


    make modules
    建立内核模块


    注:有些uClinux版本提供了更多的编译方式,比如make linux.bin。关于其他的编译方式可以参看内核源码目录里的Makefile文件。


    在介绍完常用的几个内核编译命令后,我们可以使用如下的几个命令来建立我们所需要的内核以及文件系统:
    make dep
    make clean
    make all


    这样在uClinux-dist/linux-2.x.x目录下会生成linux, System.map,在uClinux-dist/images/目录下会生成image.bin, linux.bin, image.ram, image.rom, romfs.img, linux.text, linux.data等文件。如果你编译过程中没有出现错误,但是没有我说的这些文件,你可以参看Makefile文件了解更多的东西。
    其中image.ram是直接可以下载到ram中执行的文件。在调试阶段我们就可以使用该文件。
    image.rom是一个zImage文件,可以自解压的内核,该文件需要少写到FLASH里,而不能直接放入RAM中执行。


3.uClinux内核建立过程
    建立内核首先是建立单独的内核模块和内核子系统,一旦这些建立好了之后将通过连接文件将多个文件连接在一起。该连接文件一般在arch/$(ARCH)/$(PLATFORM)/$(BOARD)/$(MODEL).ld。连接器使用该连接文件生成linux文件:
    LD -T (MODUEL).ld crt0_$(MODUEL).o [objs] -o linux
    连接文件定义了内核如何组织内存段。


    System.map文件是通过linux文件产生的,用于调试使用。通过该文件可以方便的确定函数的位置。该文件是通过如下方式产生:
    NM $(LINUX) | grep -v '\(compiled\)\|\(\.o$$\)\|\(a\)' | sort > System.map


    linux.data文件是包含内核所有数据段的代码,是通过移除linux文件中所有只读段和其他不需要的段得到的,该文件可以通过arm-elf-objcopy来产生,如:
    OBJCOPY -O binary --remove-section=.romvec --remove-section=.text\
                      --remove-section=.ramvec --remove-section=.bss\
                      --remove-section.eram linux linux.data


    linux.text文件包含了所有文本段代码,是去除数据段后的代码
    OBJCOPY -O binary --remove-section=.ramvec --remove-section=.bss\
                      --remove-section-.data --remove-section=.eram\
                      --set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE linux linux.text


    linux.bin文件,是可以实际载入内存中执行的文件,他的建立是通过linux.text和linux.data两个文件连接得到的,如:
    cat linux.text linux.data > linux.bin
    该文件只是内核,并没有包含文件系统。我们可以使用如下方式将文件系统和内核文件连接起来生成image.bin映象文件:
    cat linux.bin romfs.img > image.bin


4.手工生成ROMFS文件系统
    建立ROMFS文件系统之前应该手工建立文件系统树,例如通常ROMFS包含如下目录:
    /bin /dev /etc /lib /proc /sbin /tmp /usr /var


    然后我们可以将交叉编译好的应用程序放入/bin目录中,之后使用genromfs工具来建立文件系统的映象,如:
    genromfs -v -V "ROM Disk" -f romfs.img -d romfs > romfs.map


    最后,可以与内核文件连接在一起,然后烧入Flash中。
    cat linux.bin romfs.img > image.bin


5.参考文档
    《构建嵌入式LINUX系统》 O'REILLY
    《Linux How To》
    《Linux Documentation》



PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1425166 2009-4-2 11:19

Nucleus 操作系统 产品描述: Nucleus操作系统是Mentor Graphics嵌入式家族的标志性产品。Nucleus与EDGE开发环境和Inflexion应用设计一起构成一个完整的嵌入式应用开发平台。 除核心模块Kernel外,Nucleus还有文件系统、图形包、网络、USB和总线协议等各种组件,是连接硬件和上层应用之间的完美平台。Nucleus在手机、数字设备、汽车电子、医疗、工控、航空航天、网络、通信等领域得到了广泛应用。 主要特性 Nucleus 95%的代码是用ANSI C写成的,利于移植和支持不同的处理器。Nucleus 采用了软件组件的方法,每个组件具有单一而明确的任务,提供清晰的外部接口,易于替换和复用。Nucleus内核精炼而高效,在典型的目标环境中一般不超过20K。而丰富的功能组件和完备的开发环境更是为嵌入式系统的高级应用奠定了基础。 提供全部源代码 既有利于调试,也有利于学习与研究,更不必担心软件的“后门”。 灵活的授权(Licensing)模式 支持大多数处理器架构 ARM、MIPS、X86、PowerPC、ColdFire、DSP、NIOS II、μBlaze…。 模块化结构 可裁剪、可扩展、可配置。 所有产品同出一源 代码的一致性、兼容性得到保证,与EDGE和Inflexion无缝集成。 无需DSP开发 没有了“抹黑”的烦恼,易学易用,移植方便。 详情请联络:embedtool@163.com 13928420547

用户6818 2007-4-20 23:20

谢谢分享!

正在学习................

相关推荐阅读
用户71670 2010-01-20 16:38
GUN make 语法
译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix(当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的...
用户71670 2009-12-29 10:24
latch与dff区别
6 标签: 无标签 ...
用户71670 2009-12-08 15:09
wxWidgets编译多种库(转载)
这几天研究了一下如何在Debian Lenny下编译wxWidgets,实现多个库共存。有点入门,写出来与感兴趣的朋友一起研究。这里编译的是wxGTK 2.8.7版本,解压后,进入解压的目录,建立4个...
用户71670 2009-10-29 09:10
字符串转化为数字
6.1.2  字符串转化为数字面试例题3:使用库函数将字符串转换为数字。考点:C库函数中字符串转换为数字的使用。出现频率:★★★★解析与上节数字转换为字符串类似,C/C++语言提供了几个标准库函数,可...
用户71670 2009-09-27 16:23
ucf文件约束法
1.约束文件的概念 FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束、管脚约束以及区域约束。3类约束文件的关...
用户71670 2009-09-06 10:12
#pragma使用详解
在所有的预处理指令中,#Pragma>指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条