嵌入式Linux系统设计报告

嵌入式 Linux 系统设计报告
一、硬件设备介绍
此次实验用的板子是韦东山的 JZ2440V2,JZ2440V2 是一款基于 ARM9 的 开发板,采用 Samsung S3C2440 芯片,并采用专业稳定的 CPU 内核电源芯片 和复位芯片来保证系统运行时的稳定性。在进行器件地址说明之前,有一点需要 注意,nGCS0 片选的空间在不同的启动模式下,映射的器件是不一样的。
在 NAND Flash 启动模式下,内部的 4KBytes BootSram 被映射到 nGCS0 片选的空间; 在 Nor Flash 启动模式下( 非 Nand Flash 启动模式) , 与 nGCS0 相连的外部存储器 Nor Flash 就被映射到 nGCS0 片选的空间 SDRAM 地址空间:0x30000000 ~ 0x34000000。

嵌入式 Linux 系统的移植主要有 U-Boot、Linux 内核、文件系统这三部分。 Uboot 是在系统上电时开始执行,初始化硬件设备,准备好软件环境,然后才调 用 Linux 操作系统内核。文件系统是 Linux 操作系统中用来管理用户文件的内核 软件层。文件系统包括根文件系统和建立于 Flash 内存设备之上文件系统。根文 件系统包括系统使用的软件和库, 以及所有用来为用户提供支持架构和用户使用 的应用软件,并作为存储数据读写结果的区域。

二、Linux 系统移植步骤
1. 准备工作,包括下载源码、建立交叉编译环境等。交叉开发是指在开 发主机 上安装开发工具,编辑、编译目标板的引导程序、内核和文件系统,使 其能在目标板上运行。 2. 配置和编 bootloader(引导装载程序) 。通过这段小程序,可以初始化硬 件设备、建立内存空间的映射表,从而建立适当的系统硬件环境,为最终调用操 作系统内核做好准备。 3.配置和编译 Linux 内核,对其进行相应的裁剪,修改内核以支持相关的 硬件设备。 4. 为大容量 NAND Flash 移植 YAFFS 文件系统, 并将该文件系统加入 Linux 内核中。 5.制作 RAMdisk 来挂载根文件系统。Linux 系统中的文件和设备是通过文 件系统来组织的。文件系统的存在使得数据和设备可以被有效而透明地存取访 问。一个 linux 的最简根文件系统应该包括支持 linux 系统正常运行的基本内容, 包括系统使用的软件和库,以及所有用来为用户提供基本支持的架构和指令。
-1-

6. 烧写、调试系统;如果调试出错,则需要重新配置,返回上述步骤(2) 。

三、U-Boot 移植
3.1.U-Boot 简介
U-Boot 全称 Universal Boot Loader,是遵循 GPL 条款的开放源码项目。从 FADSROM、8xxROM、PPCBOOT 逐步发展演化而来。其源码目录、编译形式 与 Linux 内核很相似,事实上,不少 U-Boot 源码就是相应的 Linux 内核源程序 的简化, 尤其是一些设备的驱动程序,这从 U-Boot 源码的注释中能体现这一点。 但是 U-Boot 不仅仅支持嵌入式 Linux 系统的引导,当前,它还支持 NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS 嵌入式操作系统。 其目前要支持的目标 操作系统是 OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是 U-Boot 中 Universal 的一层含义,另外一层含义则是 U-Boot 除了支持 PowerPC 系列的 处理器外,还能支持 MIPS、x86、ARM、NIOS、XScale 等诸多常用系列的处理 器。这两个特点正是 U-Boot 项目的开发目标,即支持尽可能多的嵌入式处理器 和嵌入式操作系统。 就目前来看, U-Boot 对 PowerPC 系列处理器支持最为丰富, 对 Linux 的支持最完善。其它系列的处理器和操作系统基本是在 2002 年 11 月 PPCBOOT 改名为 U-Boot 后逐步扩充的。从 PPCBOOT 向 U-Boot 的顺利过渡, 很大程度上归功于 U-Boot 的维护人德国 DENX 软件工程中心 Wolfgang Denk[以 下简称 W.D]本人精湛专业水平和持着不懈的努力。当前,U-Boot 项目正在他的 领军之下,众多有志于开放源码 BOOT LOADER 移植工作的嵌入式开发人员正 如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入, 以支持更 多的嵌入式操作系统的装载与引导。

3.2. U-Boot 移植的方法
U-Boot 移植方法当前,对于 U-Boot 的移植方法,大致分为两种。一种是先 用 BDI2000 创建目标板初始运行环境,将 U-Boot 镜像文件 u-boot.bin 下载到目 标板 RAM 中的指定位置,然后,用 BDI2000 进行跟踪调试。其好处是不用将 U-Boot 镜像文件烧写到 FLASH 中去。 但弊端在于对移植开发人员的移植调试技 能要求较高,BDI2000 的配置文件较为复杂。另外一种方法是用 BDI2000 先将 U-Boot 镜像文件烧写到 FLASH 中去,然后利用 GDB 和 BDI2000 进行调试。这 种方法所用 BDI2000 的配置文件较为简单,调试过程与 U-Boot 移植后运行过程 相吻合,即 U-Boot 先从 FLASH 中运行,再重载至 RAM 中相应位置,并从那里 正式投入运行。 唯一感到有些麻烦的就是需要不断烧写 FLASH。 但考虑到 FLASH 常规擦写次数基本为 10 万次左右,作为移植 U-Boot,不会占用太多的次数,应
-2-

该不会为 FLASH 烧写有什么担忧!U-Boot 移植要点① BDI2000 的配置文件。 如果采用第二种移植方法,即先烧入 FLASH 的方法,配置项只需很少几个,就 可以进行 U-Boot 的烧写与调试了。对 PPC 8xx 系列的主板,可参考 DULG 文档 中 TQM8xx 的配置文件进行相应的修改。

3.3. 移植 U-Boot 的常见问题
在移植 U-Boot 的过程中会遇到很多问题,最主要的是一开始无法启动 U-Boot。代码中很多地方设置有误都会导致无法启动,对于 Stage1 的代码来说, 系统的出错信息是无法打印到串口或者其他设备的,此时可以使用 JTag 调试器 调试目标开发板。对于汇编编写的代码,一般都与系统硬件息息相关,在编写的 时候需要非常仔细。最好准备好 ARM 体系结构手册和 S3C2440A 芯片手册,并 且认真阅读编程模型相关的章节,对硬件的初始化流程要细心分析。

四、Linux 内核移植
4.1.内核简介
Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模 块、文件系统模块、进程间通信模块和网络接口模块。 进程调度模块用来负责控制进程对 CPU 资源的使用。所采取的调度策略是 各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作。内存 管理模块用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块 还支持虚拟内存管理方式, 使得 Linux 支持进程使用比实际内存空间更多的内存 容量。并可以利用文件系统把暂时不用的内存数据块交换到外部存储设备上去, 当需要时再交换回来。 文件系统模块用于支持对外部设备的驱动和存储。虚拟文 件系统模块通过向所有的外部存储设备提供一个通用的文件接口, 隐藏了各种硬 件设备的不同细节。从而提供并支持与其他操作系统兼容的多种文件系统格式。 进程间通信模块子系统用于支持多种进程间的信息交换方式。 网络接口模块提供 对多种网络通信标准的访问并支持许多网络硬件。

4.2. 内核移植要点
Linux 的代码完全开放以及其良好的结构设计非常适于嵌入式系统。移植 Linux 系统包括内核、 程序库和应用程序, 其中最主要的就是内核移植。 由于 Linux 内核的开放性,出现了许多针对嵌入式硬件系统的内核版本,其中著名的包括 μcLinux、RT-Linux 等。Linux 本身对内存管理(MMU)有很好的支持。因此, 在移植的时候首先要考虑到目标硬件平台是否支持 MMU。以 ARM 平台为例, ARM7 内核的 CPU 不支持 MMU,无法直接把 Linux 内核代码移植到 ARM7 核
-3-

的硬件平台上。 μcLinux 是专门针对 ARM7 这类没有 MMU 的硬件平台上设计的, 它精简了 MMU 部分代码。 本实验的目标平台是 S3C2440A, 该处理器基于 ARM9 核,支持 MMU,可以直接移植 Linux 2.6 版本的内核代码。

4.3. 移植 Linux 内核对硬件的要求
1.目标平台 目标平台包括了嵌入式处理器和周围器件,处理器可能整合了一些周围器 件,如中断控制器、定时器、总线控制器等。在移植之前需要确定被移植系统对 外部设备和总线的支持情况。本书的 ARM 开发板采用 JZ2440V2 平台,在 S3C2440A 外围连接了许多外围设备,包括 NOR Flash 存储器、NAND Flash 存 储器、网络接口芯片、USB 控制器等。在 S3C2440A 处理器内部集成了许多常 用的控制器以及嵌入式领域常用的总线控制器。对于移植 Linux 内核来说,操作 处理器内部的控制器要比外部的设备容易得多。 2.内存管理单元(MMU) 前面提到过 MMU,对于现代计算机来说,MMU 负责内存地址保护、虚拟 地址和物理地址相互转换工作。 在使用 MMU 的硬件平台上, 操作系统通过 MMU 可以向应用程序提供大于实际物理内存的地址空间,使应用程序获得更高性能。 Linux 的虚拟内存管理功能就是借助 MMU 实现的。在移植的时候要考虑目标平 台的 MMU 操作机制, 这部分代码是较难理解的, 最好能在相似代码基础上修改, 降低开发难度。 3. 内存映射 嵌入式系统大多都没有配备硬盘,外部存储器只有 Flash,并且系统内存也 非常有限。内存控制器(Memory Controller)负责内部和外部存储器在处理器地 址空间的映射,由于硬件预设的地址不同导致每种平台内存映射的地址也不同。 在移植时需要参考硬件的用户手册,得到内存地址的映射方法。 4.存储器 由于嵌入式系统多用 Flash 存储器作为存储装置。 对于文件系统来说, 在 PC 流行的 ext2、ext3 文件系统在嵌入式系统无法发挥作用。幸好 Linux 支持许多文 件系统,针对 Flash 存储器可以使用 JFFS2 文件系统。在移植的时候,不必要的 文件系统都可以裁剪掉。

五、文件系统移植
5.1. 文件系统简介
文件系统是 Linux 操作系统的重要组成部分,Linux 文件具有强大的功能。
-4-

文件系统中的文件是数据的集合, 文件系统不仅包含着文件中的数据而且还有文 件系统的结构,所有 Linux 用户和程序看到的文件、目录、软连接及文件保护 信息等都存储在其中。 Linux 和 Windows 文件类型最显着的区别就是 Linux 对目录和设备都当着文 件来进行处理,这样就简化了对各种不同类型设备的处理,提高了效率。 Linux 文件类型最主要的有四种: (1)普通文件:包括文本文件,Shell 脚本,二进制可执行程序和各类型的 数据
(2)目录文件:在 Linux 中,目录也是文件,它们包含文件名和子目录名以及指向那 些文件和子目录的指针。目录文件时 Linux 中存储文件名的唯一地方,当把文件和目录相对 应起来,也就是用指针将其连接起来之后,就构成了目录文件,因此,在对目录文件进行操 作时,一般不涉及文件内容的操作,而只是对目录名和文件名的对应关系进行操作。另外, 在 Linux 系统中的每个文件都被赋予一个唯一的值,而这个数值被称作索引节点。索引节点 存储在一个称作索引节点表中, 该表在磁盘格式化时没分配。 一个索引节点包含文件的所有 信息,包括磁盘数据的地址和文件类型。 (3)链接文件:链接文件相当于 Windows 的“快捷方式”,但是它有更强大的功能。可 以实现对不同的目录、 文件系统甚至是不同的机器上的文件直接访问, 并且不必重新占用磁 盘。 (4)设备文件:Linux 把设备都当着文件一样来进行操作,这样就大大方便了用户的 使用。在 Linux 下与设备相关的文件一般都在/dev 下,包括两种:块设备和字符设备。 块 设备是指数据读写时,他们是以块(如由柱面和扇区编址的块)为单位的设备,最简单的如 硬盘(/dev/hda1)等。

5.2. 文件系统移植的方法
文件系统是基于被划分的存储设备上的逻辑上单位上的一种定义文件的命 名、存储、组织及取出的方法。如果一个 Linux 没有根文件系统,它是不能被正 确的启动的。 因此, 我们需要为 Linux 创建根文件系统, 我们将其创建在 K9S1208 NAND FLASH 上。 Linux 的根文件系统可能包括如下目录(或更多的目录) : (1)/bin (binary):包含着所有的标准命令和应用程序; (2)/dev (device):包含外设的文件接口,在 Linux 下,文件和设备采用同种地 方法访问的,系统上的每个设备都在/dev 里有一个对应的设备文件; ( 3 ) /etc (etcetera) :这个目录包含着系统设置文件和其他的系统文件,例如 /etc/fstab(file system table)记录了启动时要 mount 的 filesystem; (4)/home:存放用户主目录;
-5-

(5)/lib(library):存放系统最基本的库文件; (6)/mnt:用户临时挂载文件系统的地方; (7)/proc:linux 提供的一个虚拟系统,系统启动时在内存中产生,用户可以直 接通过访问这些文件来获得系统信息; (8)/root:超级用户主目录; (9)/sbin:这个目录存放着系统管理程序,如 fsck、mount 等; (10)/tmp(temporary):存放不同的程序执行时产生的临时文件; (11)/usr(user):存放用户应用程序和文件。 采用 BusyBox 是缩小根文件系统的好办法,因为其中提供了系统的许多基本指 令但是其体积很小。 在根文件系统中,为保护系统的基本设置不被更改, 可以采用 cramfs 格式,它是一种只读的闪存文件系统。制作 cramfs 文件系统的 方法为:建立一个目录,将需要放到文件系统的文件 copy 到这个目录,运行 "mkcramfs 目录名 image 名"就可以生成一个 cramfs 文件系统的 image 文件。 我们使用下面的命令可以 mount 生成的 rootfs.ramfs 文件,并查看其中的内 容:mount -o loop -t cramfs rootfs.ramfs /mount/poin.对于 cramfs 闪存文件系统, 如果没有 ramfs 的支持则只能读,而采用 jfss2(The Journalling Flash File System version 2 )文件系统则可以直接在闪存中读、写数据。 jfss2 是一个日志结构 (log-structured)的文件系统, 包含数据和原数据(meta-data)的节点在闪存上顺序地 存储。jfss2 记录了每个擦写块的擦写次数,当闪存上各个擦写块的擦写次数的 差距超过某个预定的阀值,开始进行磨损平衡的调整。调整的策略是,在垃圾回 收时将擦写次数小的擦写块上的数据迁移到擦写次数大的擦写块上以达到磨损 平衡的目的。 为使 Linux 支持 yaffs 文件系统,我们需要将其对应的驱动加入到内核中 fs/yaffs/, 并修改内核配置文件。 使用我们使用 mkyaffs 工具可以将 NAND FLASH 中的分区格式化为 yaffs 格式(如/bin/mkyaffs /dev/mtdblock/0 命令可以将第 1 个 MTD 块设备分区格式化为 yaffs) ,而使用 mkyaffsimage(类似于 mkcramfs、 mkfs.jffs2)则可以将某目录生成为 yaffs 文件系统镜像。嵌入式 Linux 还可以使 用 NFS(网络文件系统)通过以太网挂接根文件系统,这是一种经常用来作为调 试使用的文件系统启动方式。通过网络挂接的根文件系统,可以在主机上生成 ARM 交叉编译版本的目标文件或二进制可执行文件,然后就可以直接装载或执 行它, 而不用频繁地写入 flash。 如广州友善之臂的 demo 提供如下三种启动方式: (1)从 cramfs 挂接根文件系统:root=/dev/bon/2(); (2)从移植的 yaffs 挂接根文件系统:root=/dev/mtdblock/0; (3)从以太网挂接根文件系统:root=/dev/nfs。

-6-

把生成的文件系统烧到开发板中,当看到上图信息,这说明 yaffs2 已经移植成功。

六、结论
通过本实验详细的进行了 u-boot、内核、根文件系统的移植,成功的配置成 了自己想要的 Linux 系统,更加清楚的诠释了 Linux 可移植性高的特性。使得自 己对 JZ2440V2 更加深入的了解,也更加熟练了系统移植的过程。

-7-


相关文档

基于Linux的嵌入式视觉系统设计
嵌入式linux与嵌入式系统设计报告
嵌入式系统设计_Linux命令实验报告
关于Linux嵌入式系统设计的层次设计
嵌入式Linux 系统开发模式
嵌入式Linux系统设计与开发-精品文档
嵌入式Linux系统设计与开发
基于SKYEYE的嵌入式Linux系统设计课程设计报告
嵌入式Linux软件平台系统设计说明书
嵌入式的Linux软件平台系统设计说明书
电脑版