Building Embedded Linux Systems 构建嵌入式 Linux 系统 计算机应用教研室 @ 计算机学院嵌入式系统实验室 @ 苏州研究院中国科学技术大学 /media/samsung/work/6 实验室相关
Outline 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
1 建立目标板 Linux 的基本步骤 建立目标板 Linux 系统有 4 个重要的步骤 : 1 决定系统组件 Linux 具有大量可选软件, 应当为目标系统列出必须的功能清单 2 配置并建立内核选择合适的 Linux 内核版本与适当的配置建立内核 3 建立根文件系统 4 设置引导软件与配置
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
2 开发嵌入式 Linux 系统最常用的主机类型 I 开发嵌入式 Linux 系统最常用的主机类型 1 Linux 工作站通常就是一台安装了某个标准的 Linux 发行套件的 PC 机, 如 Debian Mandrake Red Hat 等 需约 2 3G 或更多的磁盘空间进行嵌入式 Linux 开发建议具有 128 或以上的 RAM 及交换空间 2 Unix 工作站由于 Linux 与 Unix 非常相似, 对 Linux 适用的通常对 Unix 也适用 3 Windows 工作站 许多开发者比较习惯 Windows 平台, 并希望在 Windows 平台上开发嵌入式 Linux 系统
2 开发嵌入式 Linux 系统最常用的主机类型 II Cygwin: 可在 Windows 平台上建立跨平台开发工具链 VMWare: 可在虚拟环境中执行 Linux, 并在 Linux 上进行嵌入式 Linux 的开发
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
3 主机 / 目标机的开发体系结构 在嵌入式 Linux 系统开发中, 存在 3 种主机 / 目标机开发体系结构 1 连接式 2 使用可移动存储设备 3 独立开发式
(1) 连接式 (the linked setup ) I 目标板和主机通过一个物理线路 ( 如串行线或者以太网连接 ) 永久的连接在一起 好处 : 目标代码的传送无需物理存储设备参与, 只需要上述连接就足够了 在这种方式中, 主机包含了跨平台开发环境, 而目标板则包含了适当的引导加载程序 可用的内核以及最起码的根文件系统
(1) 连接式 (the linked setup )II 另一种做法是, 以远程组件来简化目标板的开发工作, 例如 通过 TFTP 下载内核 (TFPT:Trivial File Transfer Protocol, 小型文件传输协议比 FTP 简单 ) 此外, 根文件系统还可以通过 NFS 安装, 而不必在目标板中使用存储介质 (NFS:Network File System, 网络文件系统允许访问远程计算机上的文件 ) 还可以使用连接进行调试 通常使用以太网连接进行下载功能, 而使用 RS232 串口连接进行调试
(2) 使用可移动存储设备,the removable storage setup 主机和目标板之间没有实际的连接 先由主机将数据写入存储设备, 然后将存储设备转接到目标板, 并使用该存储设备引导目标板同样的, 在主机上包含了跨平台开发环境 而目标板则只包含了最起码的引导加载程序 其余的组件被存放在可移动存储设备上 一种通常的操作方式使用易插拔的 flash 芯片 : 先在主机上使用 flash 编程器将数据写入芯片, 然后再将该芯片插入目标板上的插座中
(3) 独立开发系统 嵌入式 Linux 开发综述 在这种设置中, 目标板是个独立的开发系统, 它包含了引导 操作以及开发额外软件所必须的任何软件 不需要跨平台开发环境, 不必在主机和目标板之间传送任何数据适合以 PC 为主的高级嵌入式系统的开发
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
4 主机 / 目标板的调试方式 用来连接目标板与主机进行调试的接口基本上有 3 种类型 : 1 串行线 2 网络接口 3 特殊的调试硬件 BDM JTAG
(1) 使用串行线进行调试 这是从主机对目标板进行调试的最简单的做法 缺点 : 串行连接的速度比较有限当嵌入式系统中只有一个串行串口, 或者串行连接是嵌入式系统对外唯一的接口, 那么就不可能在对系统调试的同时, 以终端仿真器跟系统交互
(2) 使用网络接口进行调试 这种方式与串行线连接相比, 可以提供较高的带宽 由于可以在相同的物理网络连接上使用多重网络连接, 可以兼顾调试与终端仿真交互 缺点 : 无法使用网络连接对 Linux 内核进行调试 因为网络协议栈本身在 Linux 内核里 相对而言, 内核的调试通常可以通过串行连接来进行
(3) 使用特殊的调试硬件 通常会使用 BDM 或 JTAG 接口 这些接口依靠的是 CPU 芯片中内嵌的 BDM 或 JTAG 特殊功能 只要将一个特殊的调试器连接到 CPU 上的 JTAG 或 BDM 相关管脚, 就可以完全控制 CPU 的行为 因此, 当遇到新的嵌入式目标板 或者对目标板上的 Linux 内核进行调试时, 通常会使用 JTAG 和 BDM BDM, Background Debug Mode 背景调试模式 JTAG, Joint Test Action Group 联合测试小组采用 IEEE 11491, 测试存取 口和边界扫描标准
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
5 嵌入式 Linux 系统的一般架构 如图所示, 包含 4 个部分 : 1 硬件 2 内核 3 文件系统等 4 应用程序 / 库
(1) 硬件 嵌入式 Linux 开发综述 目标板的硬件必须符合一些要求方能执行 Linux 系统 至少 32 位 CPU 一般情况下必须配备 MMU( 对于不配备 MMU 的考虑使用 uclinux) RAM 容量必须满足系统的需要一些最起码的 I/O 能力, 以便在线调试具有某种形式的永久性或网络存储设备以便内核加载及 ( 或 ) 存取根文件系统
(2)Linux 内核 嵌入式 Linux 开发综述 Linux 内核是 Linux 操作系统的中心组件 使用内核的目的是希望以一致的方式管理硬件, 以及为用户软件提供高层抽象层 内核大致可以分成两个部分 : 底层接口层和高层抽象层 底层接口层专属于硬件配置, 内核运行其上, 并以硬件无关的高层抽象层提供对硬件资源的直接控制 比如, 对于 PPC 和 ARM 系统, 尽管其寄存器或内存分页的处理方式不同, 但却可以使用通用的 API 来存取内核里高层的组件 通常底层部分会处理 CPU 特有的操作 架构特有的内存操作以及设备的基本 I/O
(3) 文件系统和网络协议等 在 Linux 内核的底层接口层与高层抽象层之间, 内核有时会用到与特定设备上的结构化数据交互的组件, 例如文件系统和网络协议 通常,Linux 内核至少需要一个具有合适结构的根文件系统 Linux 内核会从中加载第一个应用程序 加载模块并为进程提供工作目录
(4) 应用程序 / 库 嵌入式 Linux 开发综述 内核上面是应用程序和工具程序 链接库通常与应用程序动态链接在一起
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
6 系统启动过程 I 嵌入式 Linux 开发综述 在系统启动过程里, 有 3 个主要软件组件参与其中 : 1 引导加载程序 2 内核 3 Init 进程 1 引导加载程序 引导加载程序是系统启动过程中执行的第一个软件, 它与目标板的硬件有高度的依赖关系 Linux 有许多引导加载程序可用 引导加载程序在完成底层硬件初始化工作后会接着跳到内核的启动程序代码执行
6 系统启动过程 II 嵌入式 Linux 开发综述 2 内核 3 Init 进程 内核一开始的启动程序代码会因架构不同而有很大的差异, 而且在为 C 程序代码设置合适的执行环境之前, 它会先为自己进行初始化工作 完成以上工作后, 内核会跳到与架构无关的 start kernel 函数执行, 此函数会初始化高层内核功能, 安装根文件系统, 以及启动 init 进程 启动各种应用程序 ( 根据设置 )
Outline 嵌入式 Linux 开发综述 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
7 引导配置的类型 I Linux 系统的引导配置与所选用的引导加载程序 它的配置以及主机中软硬件的类型有非常密切的关系 1 固态存储媒体 2 磁盘 3 网络 1 固态存储媒体, 固态存储媒体用于存放最初的引导加载程序配置参数内核根文件系统
7 引导配置的类型 II 2 磁盘 磁盘引导配置方式广泛应用于工作站及服务器中, 此时内核和根文件系统位于磁盘上最初的内核加载程序不是从磁盘上加载, 第二个内核加载程序就是直接从磁盘获得内核本身可以用于嵌入式系统的开发阶段 要求 : 目标板上能够使用硬盘或者具有模仿硬盘的装置
7 引导配置的类型 III 3 网络 网络引导配置方式中, 存在两种情况 : 1 内核位于固态存储设备上或磁盘上, 需要通过 NFS 安装根文件系统 2 只有内核加载程序位于目标板的存储设备上, 需要通过 TFTP 下载内核和根文件系统 ( 或 NFS) 往往用于开发初期 嵌入式 Linux 系统在开发的不同阶段可能会使用不同的引导配置, 但大部分在开发完成后使用固态存储媒体
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) Outline 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 内核是所有 Linux 系统软件组成的核心 它的性能对整个系统的性能起决定性作用 如果内核不支持目标板上的某个硬件, 那么在目标板上使用这个内核时, 这个硬件就不能起作用 下面讨论如何为一个嵌入式系统准备好一个可用的 Linux 内核, 包括内核的选择 配置 编译和安装
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) Linux 内核源代码中的主要子目录 I Documentation 内核方面的相关文档 arch 与体系结构相关的代码 对应于每个支持的体系结构, 有一个相应的目录如 i386 arm alpha 等 每个体系结构子目录下包含几个主要的子目录 : kernel 与体系结构相关的核心代码 mm 与体系结构相关的内存管理代码 lib 与体系结构相关的库代码 include 内核头文件 对每种支持的体系结构有相应的子目录 init 内核初始化代码 kernel 内核管理代码
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) Linux 内核源代码中的主要子目录 II mm 内存管理代码 ipc 进程间通讯代码 net 网络部分代码 lib 与体系结构无关的内核库代码 drivers 设备驱动代码 每类设备有相应的子目录, 如 char block net 等 fs 文件系统代码 每个支持文件系统有相应的子目录, 如 ext2 proc 等 modules 可动态加载的模块 Scripts 配置核心的脚本文件
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 步骤 Linux 内核从配置到安装大致有如下步骤 : 清理 :make mrproper 配置 :make config/menuconfig/xconfig 建立依赖关系 :make dep 编译 :make 或 make zimage 安装 :make install 但在嵌入式系统开发中, 并不总是按照上述步骤
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 1 Linux 内核选择 I 尽管 http://wwwkernelorg 是主要的内核来源, 但这里可用的内核版本并不总适用于嵌入式系统 下面列出了针对当前主要嵌入式系统的 Linux 内核源代码下载地点, 通常直接提供了针对某种目标硬件系统的 Linux 内核版本
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 1 Linux 内核选择 II 为了获得适合目标系统的内核, 必须从主要的站点下载内核, 还要打上合适的补丁 例如 ARM Linux 仅仅发布 Linux 官方内核的补丁
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 1 Linux 内核选择 III 找到合适的 Linux 内核版本后, 把它下载到某个目录中, 解压
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 2 Linux 内核的配置 配置有很多种方法, 配置过程中有很多选项可选 配置的结果是生成一个 config 文件以及大量的符号连接和头文件, 用于后续的过程 config 文件中保存了在配置过程中定义的变量, 在 Linux 内核目录下的 Makefile 中将会包含这个文件
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) Outline 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) µclinux-dist-20080808 的编译和运行 I 下载源代码 uclinux-dist-20080808tarbz2, 解压缩 下载交叉编译器 arm-linux-tools-20061213targz( 版本 gcc-344), 解压缩, 安装 编译 cd uclinux-dist make memuconfig 在 vendor/product 选项中选择 GDB/SkyEye Kernel 版本选择 24x 其他选项不变 ( 使用缺省选项 ) make dep; make
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) µclinux-dist-20080808 的编译和运行 II 在 skyeye 上运行 µclinux 建立 skyeyeconf 拷贝 skyeye-testsuite- 128/uClinux/at91/uclinux cs8900a/skyeyeconf
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) µclinux-dist-20080808 的编译和运行 III 修改后, 内容如下 : 运行如下命令 skyeye -c skyeyeconf -e linux-24x/linux
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) Outline 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 准备交叉编译环境 I 下载 arm-linux-tools-20061213targz 在根目录下解压缩 cd / sudo tar zvxf arm-linux-tools-20061213targz
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 准备交叉编译环境 II 查看安装是否成功
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 准备交叉编译环境 III 查看版本信息
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 编译 armlinux I 从 kernelorg 上找到 china 的镜像网站, 下载 linux-2626tarbz2 在工作目录 $WDIR 中解压缩, 后执行如下命令 cd linux-2626 make ARCH=arm CROSS COMPILE=arm-linux- s3c2410 defconfig make ARCH=arm CROSS COMPILE=arm-linux- dep make ARCH=arm CROSS COMPILE=arm-linux- menuconfig 修改如下 :
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 编译 armlinux II Device Driver Character Driver Serial Driver, 取消 8250/16550 and compatible serial support 选项 修改 include/asm-arm/arch-s3c2410/maph #define S3C2410 CS6 (0xC0000000UL) 修改 include/asm-arm/arch-s3c2410/memoryh #define PHYS OFFSET (0xC0000000UL) Boot options Default kernel command string: mem=32m console=ttysac0 root=/dev/ram initrd=0xc0800000,0x00800000 rw [ 可选 ]File systems 中, 仅仅保留 ext2 [ 可选 ]Networking, 取消 Networking support [ 可选 ]Device Driver, 取消 I2C support 和 USB support
µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 编译 armlinux III make ARCH=arm CROSS COMPILE=arm-linux- zimage 需要等待较长时间
小结 1 嵌入式 Linux 开发综述 2 µclinux-dist-20080808 的编译和运行编译 armlinux(linux-2626)( 同 SkyEye 中 ) 3 小结和作业
作业 : 在嵌入式 Linux 系统开发中, 存在哪几种主机 / 目标机开发体系结构? 主机 / 目标板的调试方式有哪几种? 嵌入式 Linux 系统的引导配置的类型有哪几种?
Thanks! The end