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》

uClinux移植概述相关推荐

  1. uClinux移植与分析(3)

    进程切换部分代码实现 移植linux,修改的主要就是和平台相关的那部分代码.linux里面和平台相关的代码,包括很多方面,比如boot过程,系统调用,中断处理,设备驱 动,还有部分信号(软中断)处理等 ...

  2. uclinux开发概述

    前些日子基于arm+uClinux开发了一个网络监控系统,眼看项目马上要做完了,终于松了一口气,于是整理了一些笔记和心得想和大家针对这种开发模式进行一些探讨,希望对各位有所帮助. 按照我的开发过程想分 ...

  3. 在ARMSYS(S3C44B0X开发板)上进行uClinux内核移植的总结

    标题 针对"如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植"的一个总结,其内容包括对Bootloader的功能分析和uClinux2.4.24发行版 ...

  4. arm linux嵌入式网络控制系统,基于ARM uCLinux的网络控制系统设计与实现

    引言    随着网络和通信技术的发展,嵌入式系统现已进入高速发展阶段.并在社会各个领域得到了广泛的应用.本文介绍了一种采用ARM+uCLinux作为开发平台.实现基于TCP/IP的远程系统监控.从而取 ...

  5. SPIFFS文件系统移植–基于STM32F407

    http://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=616126&highlight=%E6%96%87 ...

  6. 高通 qca-wifi 移植

    SPF6.1_QCA-WIFI移植 概述 qca-wifi 移植 代码合入 编译 insmod qca-wifi 初始化调试 luci联调 总结 概述 移植的方案是高通的SPF6.1版本,移植到开源O ...

  7. 《创客学院嵌入式从入门到精通》笔记--10全面掌握嵌入式系统移植

    目录 01嵌入式基本概念,嵌入式开发环境搭建,目标机搭建,TFTP服务搭建,NFS服务搭建 1.系统移植概述及环境搭建 1.通用嵌入式系统软件组成部分 2.Linux 在嵌入式中应用的条件与前景 3. ...

  8. 海思平台上USB WIFI的移植与局域网无线调试和视频流预览-第5/11季视频课程-朱有鹏-专题视频课程...

    海思平台上USB WIFI的移植与局域网无线调试和视频流预览-第5/11季视频课程-143人已学习 课程介绍         本季课程在开发板上移植USB WIFI模块(套装附带的MT7601模块), ...

  9. linux之mini2440内核移植

    与其它操作系统相比,Linux最大的特点:它是一款遵循GPL(General Public License  GNU通用公共许可证(简称为GPL),是由自由软件基金会发行的用于计算机软件的许可证.)的 ...

最新文章

  1. (转)使用CGLIB实现AOP功能与AOP概念解释
  2. 理解字节序(大小端)
  3. IE的hasLayout
  4. Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
  5. 23种设计模式(8)-外观模式
  6. MindManager中读图工具的使用
  7. matlab仿真电子秤,基于单片机的电子秤设计
  8. [图文详解]图像处理中的高斯模糊
  9. pillow英文手册
  10. 修改窗口的风格ModifyStyle
  11. CC2430 串口使用详解
  12. 【PyQt5与Requests爬虫】设计图形界面(GUI)实现小说下载器-进度条显示
  13. 关于“墨者安全专家3.7”不得不说的事情
  14. lambda函数用法及注意事项(简单总结,有待补充)
  15. uniapp开发技术
  16. java ()括號_Java提取中括號中的內容
  17. 数据可视化 数据可视化看板项目一:(1)模拟实时数据 -使用MYSQL的事件建立动态模拟数据,每秒更新一次 (1)
  18. dot product【点积】
  19. Linux开发工具3
  20. Axure绘制流程图

热门文章

  1. ConvMixer:Patches Are All You Need
  2. 定时器之计时(时间的转换)
  3. Unity中的AI算法和实现1-Waypoint
  4. 表或视图不存在的解决方法
  5. 一些Pixel手机的使用技巧
  6. 注册jar包为windows服务
  7. 最新kali之cadaver
  8. C++ string 转化为LPCTSTR
  9. 智能硬件蓝牙配网方案概要
  10. Ubantu 一条命令安装宝塔