Download - 嵌入式 Linux 移植

Transcript
Page 1: 嵌入式 Linux 移植

嵌入式 Linux 移植

乔义川07 检测技术与自动化

Page 2: 嵌入式 Linux 移植

大纲 嵌入式 OS 的分类及各自特点 嵌入式 Linux 的特点 嵌入式 Linux 的移植 讨论

Page 3: 嵌入式 Linux 移植

嵌入式系统的分类 嵌入式 Linux

Linux 本身的种种特性使其成为嵌入式开发的首选。嵌入式协会( ELC )发布了 ELC 产品规范版本 1.0,更为嵌入式 Linux 的开发提供了提供了方便。• RT-Linux • uCLinux(Micro-Control-Linux)• mizi-linux : 由韩国 mizi 公司根据 Linux 2.4 内核

移植而来,支持 S3C2410A 处理器

Page 4: 嵌入式 Linux 移植

嵌入式系统的分类 uClinux

uClinux 是很常用的一种嵌入式 Linux ,它去掉了 Linux 中的内存管理单元 (MMU) ,主要用于没有内存管理单元的处理器(比如三星公司的 S3C44B0X )。它是继承了标准 Linux 的优良特性,针对嵌入式处理器的特点设计的一种操作系统,具有内嵌网络协议、支持多种文件系统,开发者可利用标准 Linux先验知识等优势。其编译后目标文件可控制在几百KB 量级。

Page 5: 嵌入式 Linux 移植

嵌入式系统的分类 Windows CE

Microsoft Windows CE 是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对于从掌上电脑到专用的工业控制器的用户电子设备进行定制。操作系统的基本内核需要至少 200K 的 ROM 。

Page 6: 嵌入式 Linux 移植

嵌入式系统的分类 VxWorks

VxWorks 是目前嵌入式系统领域中使用最广泛、市场占有率最高的系统。它支持多种处理器,如 x86 、i960 、 Sun Sparc 、 Motorola MC68xxx 、 MIPS RX000 、 POWER PC 等等。大多数的 VxWorks API 是专有的。采用 GNU 的编译和调试器。

Page 7: 嵌入式 Linux 移植

嵌入式系统的分类 uC/OS

uC/OS 是一个典型的 RTOS ,该系统从 1992 年开始发展,目前流行的是第二个版本,即 uC/OS II 。它的特点可以概括为一下几个方面:

公开源代码良好的可移植性( Portable )可裁剪( Scalable )可固化( ROMable )占先式 (Preemptive)多任务……

Page 8: 嵌入式 Linux 移植

嵌入式系统的分类 LynxOS

Lynx Real-time Systems 的 LynxOS 是一个分布式、嵌入式、可规模扩展的 RTOS ,它遵循 POSIX.1a 、POSIX.1b 和 POSIX.1c 标准。 LynxOS 支持线程概念,提供 256 个全局用户线程优先级;提供一些传统的、非实时系统的服务特征;包括基于调用需求的虚拟内存,一个基于 Motif 的用户图形界面,与工业标准兼容的网络系统以及应用开发工具。• Portable Operating System Interface

Page 9: 嵌入式 Linux 移植

嵌入式系统的分类 Palm OS

Palm OS 是一种 32 位的嵌入式 OS ,用于掌上电脑。此系统是 3Com 公司的 Palm Computing 部(以独立成一家公司)开发的。它运行在一个抢占式的多任务内核之上,同一时刻用户界面仅仅允许一个应用程序被打开,与同步软件 HotSync结合可以使掌上电脑与 PC 上的信息实现同步,把 PC 的功能扩展到了手掌上。它具有强大的灵活性和良好的可移植性,是一款非常流行的掌上电脑操作系统。

Page 10: 嵌入式 Linux 移植

嵌入式系统的分类 QNX OS-9 pSOS ……

Page 11: 嵌入式 Linux 移植

嵌入式 Linux 的特点 一、广泛的硬件支持 Linux能够支持 x86 、 ARM 、 MIPS 、 ALPHA 、

PowerPC 等多种体系结构,目前已经成功移植到数十种硬件平台,几乎能够运行在所有流行的 CPU上。 Linux 有着异常丰富的驱动程序资源,支持各种主流硬件设备和最新硬件技术,甚至可以在没有存储管理单元( MMU )的处理器上运行,这些都进一步促进了 Linux 在嵌入式系统中的应用。

Page 12: 嵌入式 Linux 移植

嵌入式 Linux 的特点 二、内核高效稳定

Linux 内核的高效和稳定已经在各个领域内得到了大量事实的验证, Linux 的内核设计非常精巧,分成进程调度、内存管理、进程间通信、虚拟文件系统和网络接口五大部分,其独特的模块机制可以根据用户的需要,实时地将某些模块插入到内核或从内核中移走。这些特性使得 Linux 系统内核可以裁剪得非常小巧,很适合于嵌入式系统的需要。

Page 13: 嵌入式 Linux 移植

嵌入式 Linux 的特点 三、开放源码,软件丰富

Linux 是开放源代码的自由操作系统,它为用户提供了最大限度的自由度,由于嵌入式系统千差万别,往往需要针对具体的应用进行修改和优化,因而获得源代码就变得至关重要了。 Linux 的软件资源十分丰富,每一种通用程序在 Linux 上几乎都可以找到,并且数量还在不断增加。在 Linux 上开发嵌入式应用软件一般不用从头做起,而是可以选择一个类似的自由软件做为原型,在其上进行二次开发。

Page 14: 嵌入式 Linux 移植

嵌入式 Linux 的特点 四、优秀的开发工具

传统的嵌入式开发调试工具是在线仿真器( In-Circuit Emulator , ICE ),它通过取代目标板的微处理器,给目标程序提供一个完整的仿真环境,从而使开发者能够非常清楚地了解到程序在目标板上的工作状态,便于监视和调试程序。价格非常昂贵,只适合做非常底层的调试。嵌入式 Linux 为开发者提供了一套完整的工具链( Tool Chain ),它利用 GNU 的 gcc做编译器,用 gdb 、 kgdb 、 xgdb做调试工具,能够很方便地实现从操作系统到应用软件各个级别的调试。

Page 15: 嵌入式 Linux 移植

嵌入式 Linux 的特点 五、完善的网络通信和文件管理机制

Linux 至诞生之日起就与 Internet密不可分,支持所有标准的 Internet 网络协议,并且很容易移植到嵌入式系统当中。此外, Linux还支持 ext2 、 fat16 、fat32 、 romfs 等文件系统,这些都为开发嵌入式系统应用打下了很好的基础。

Page 16: 嵌入式 Linux 移植

嵌入式 Linux 系统的组成部分 一、引导程序能实现系统的快速引导,提供瞬间开机功能。负责将 Linux 内核加载到内存,并将控制权交给内核初始化程序。具体工作包括:寻找或将指定的内核映像解压,解压文件系统。

Page 17: 嵌入式 Linux 移植

嵌入式 Linux 系统的组成部分 二、 Linux 内核

Linux 是一个单一内核操作系统,但可以动态装入和卸载内核中的部分源代码,这与传统的单一内核操作系统全部静态编译内核代码是不同的。 Linux内核由内存管理、进程管理、定时器中断管理、模块管理、虚拟文件系统、接口文件系统、设备驱动程序、进程间通信、网络管理、系统启动等构成。

Page 18: 嵌入式 Linux 移植

嵌入式 Linux 系统的组成部分 三、初始化进程

系统在刚刚启动时,运行于内核方式,这时候只有一个初始化进程在运行,他首先做系统的初始化,然后执行初始化程序(一般是 /sbin/init )。初始化进程是系统的第一个进程,以后所有的进程都是初始化进程的子进程。

Page 19: 嵌入式 Linux 移植

嵌入式 Linux 系统的组成部分 四、硬件驱动程序

设备驱动程序是内核的一部分,它像内核中其它代码一样运行在内核模式。驱动程序如果出错将会使操作系统受到严重破坏,甚至能使系统崩溃并导致文件系统的破坏和数据丢失。 Linux 设备驱动程序的主要功能有:对设备进行初始化;使设备投入运行和退出服务;从设备接收数据并将它们送回内核;将数据从内核送到设备;检测和处理设备出现的错误。

Page 20: 嵌入式 Linux 移植

嵌入式 Linux 系统的组成部分 五、应用程序

提供所需功能的一个或更多应用程序。

Page 21: 嵌入式 Linux 移植

移植的概念 移植步骤 a.Bootloader 的移植;

b. 嵌入式 Linux 操作系统内核的移植;c. 嵌入式 Linux 操作系统根文件系统的创建;d. 电路板上外设 Linux驱动程序的编写。

Page 22: 嵌入式 Linux 移植

移植的准备工作 PC 平台装有 Linux 操作系统或在 Windows 操作系统下安装Cygwin

目标平台CPU: S3C2410SDRAM: HY57V561620Nand flash: K9F1208U0B ( 64MB )以太网芯片: CS8900A ( 10M/100MB )

Page 23: 嵌入式 Linux 移植

源码包 linux kernel

linux-2.6.14.1.tar.gz Skyeye

skyeye-1.2-RC8-3.tar.bz2 toolchain

cross-2.95.3.tar.bz2 ,也可以使用 gcc , gdb , glibc , binutils 等工具自己编译产生。

Page 24: 嵌入式 Linux 移植

源码包 binuils

binutils-2.16.tar.gz gcc

gcc-3.4.4.tar.bz2 glibc

glibc-2.3.5.tar.gzglibc-linuxthreads-2.3.5.tar.gz

gdbgdb-5.2.tar.bz2

u-bootu-boot1.1.4.tar.bz2

Page 25: 嵌入式 Linux 移植

源码包 Batch (补丁)

ioperm.c.diff 作用:打修正 ioperm()函数 flow.c.diff 作用:该补丁用于产生 crti.o 和 crtn.o文件t-linux.diff 作用:修改 gcc 一处 bug

其他工具busybox-1.1.3.tar.gz

mkcramfs

Page 26: 嵌入式 Linux 移植

交叉编译工具

Page 27: 嵌入式 Linux 移植

bootloader 与 u-boot

BootLoader 是系统加电启运行的第一段软件代码,PC机中的引导加载程序由 BIOS (其本质就是一段固件程序)和位于硬盘MBR 中的引导程序一起组成。 BIOS 在完成硬件检测和资源分配后,将硬盘MBR 中的引导程序读到系统的 RAM 中,然后将控制权交给引导程序。引导程序的主要运行任务就是将内核映象从硬盘上读到 RAM 中 然后跳转到内核的入口点去运行,也即开始启动操作系统。

Page 28: 嵌入式 Linux 移植

bootloader 与 u-boot

BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图(有的 CPU 没有内存映射功能如 S3C44B0 ),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。

Page 29: 嵌入式 Linux 移植

bootloader 与 u-boot

每种不同的 CPU 体系结构都有不同的 BootLoader 。除了依赖于 CPU 的体系结构外, BootLoader 实际上也依赖于具体的嵌入式板级设备的配置,因此为嵌入式系统建立一个通用的 BootLoader 是很困难的

U-boot 是德国 DENX小组的开发用于多种嵌入式 CPU 的bootloader 程序 , UBoot不仅仅支持嵌入式 Linux 系统的引导,当前,它还支持 NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS 嵌入式操作系统。 U-Boot除了支持 PowerPC 系列的处理器外,还能支持 MIPS 、 x86 、 ARM 、NIOS 、 XScale 等诸多常用系列的处理器。

Page 30: 嵌入式 Linux 移植

Boot Loader 的操作模式 (Operation Mode)

启动加载( Boot loading )模式:这种模式也称为 " 自主 " ( Autonomous )模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯, Boot Loader 显然必须工作在这种模式下。

Page 31: 嵌入式 Linux 移植

Boot Loader 的操作模式 (Operation Mode)

下载( Downloading )模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机( Host )下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的 FLASH 类固态存储设备中。 Boot Loader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。

Page 32: 嵌入式 Linux 移植

u-boot功能 系统引导

• 支持 NFS挂载、从 FLASH 中引导压缩或非压缩系统内核 基本辅助功能

• 强大的操作系统接口功能; • 可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对 Linux 支持最为强劲;

• 支持目标板环境参数多种存储方式,如 FLASH 、 NVRAM 、 EEPROM ;

• CRC32校验,可校验 FLASH 中内核、 RAMDISK镜像文件是否完好 ;

• 设备驱动;上电自检功能; SDRAM故障检测; CPU 型号;特殊功能, XIP 内核引导……

Page 33: 嵌入式 Linux 移植

u-boot 移植 为了使 U-Boot 支持新的开发板,一种简便的做法是

在 U-Boot已经支持的开发板中选择一种和目标板接近的,并在其基础上进行修改。

移植前的准备 • 阅读相关文档• config.mk , flash.c 的修改• 修改 flash 和 SDRAM 的参数设置(以 Byte 为单

位)• 其他事项,比如准备源码,建立交叉开发环境等

Page 34: 嵌入式 Linux 移植

u-boot 移植 在建立的开发环境下进行移植工作。绝大多数的开发环境是交叉开发环境。在这方面, DENX 和 MontaVista均提供了完整的开发工具集

在目标板与开发主机间接入硬件调试器,一般使用 BDI2000 。一方面,其价格不如 ICE 调试器昂贵,同时其可靠性高,功能强大,完全能胜任移植和调试 u-Boot 。另外,网上也有不少关于 BDI2000 调试方面的参考文档。

如果在参考开发板上移植 U-Boot ,可能需要移除目标板上已有的 boot loader 。

Page 35: 嵌入式 Linux 移植

u-boot 移植 修改文件

• < 目标板 >.c 文件• < 目标板 >.h头文件• FLASH 的驱动程序 • 串口驱动

配置,编译 把 boot.bin 和 u-boot.gz烧到 flash里面去,或 RAM 中的指定位置

Page 36: 嵌入式 Linux 移植

u-boot 移植 对于 U-Boot 的移植方法,大致分为两种

• 一,先用 BDI2000创建目标板初始运行环境,将U-Boot镜像文件 u-boot.bin 下载到目标板 RAM中的指定位置,然后,用 BDI2000 进行跟踪调试。

• 其好处是不用将 U-Boot镜像文件烧写到 FLASH中去。

• 但弊端在于对移植开发人员的移植调试技能要求较高, BDI2000 的配置文件较为复杂。

Page 37: 嵌入式 Linux 移植

u-boot 移植 另外一种方法是用 BDI2000 先将 U-Boot镜像文件烧写到 FLASH 中去,然后利用 GDB 和 BDI2000进行调试。这种方法所用 BDI2000 的配置文件较为简单,调试过程与 U-Boot 移植后运行过程相吻合,即 U-Boot 先从 FLASH 中运行,再重载至 RAM 中相应位置,并从那里正式投入运行。麻烦的就是需要不断烧写 FLASH 。

Page 38: 嵌入式 Linux 移植

Linux-2.6 内核的移植 修改Makefile

• 找到 ARCH 和 CROSS_COMPILE ,修改 ARCH  ?= arm

• CROSS_COMPILE   ?= armlinux

设置 PATH环境变量,使其可以找到交叉编译工具链

设置 flash 分区

Page 39: 嵌入式 Linux 移植

Linux-2.6 内核的移植 配置内核

• 支持启动时挂载 devfs为了内核支持 devfs 以及在启动时并在 /sbin/init 运行之前能自动挂载 /dev 为 devfs 文件系统,修改 fs/Kconfig文件 [arm@localhost linux2.6.14]$ vi fs/Kconfig

• 配置内核产生 .config 文件make menuconfigmake zImage

• 编译内核,生成 zImage• 下载 zImage 到开发板

Page 40: 嵌入式 Linux 移植

构造目标板的根目录及文件系统 建立一个目标板的空根目录 在 my_rootfs 中建立 Linux 目录树 创建 linuxrc 文件

• 挂载 /etc 为 ramfs, 并从 /mnt/etc 下拷贝文件到 /etc 目录当中

• 挂载 /proc 为 proc 文件系统• 挂载 /sys 为 sysfs 文件系统• 挂载其他文件系统

相关配置文件的创建• 创建帐号及密码文件• 创建 profile 文件• 创建 fstab 文件

Page 41: 嵌入式 Linux 移植

移植 Busybox

busybox 是 linux 的命令工具集,包含例如 login ,insmod 等许多 linux命令的源代码,编译这个源码包,就会生成若干 linux命令工具的可执行程序。

这里需要注意一点的是,只要 install busybox ,我们根文件系统下先前建好的 linuxrc就会被覆盖为一同名二进制文件。所以要事先备份我们自己的 linuxrc ,在安装完 busybox 后,将 linuxrc复制回去就好。

Page 42: 嵌入式 Linux 移植

谢谢大家!