嵌入式 Linux 聚芯嵌入式系统设计研修班潘家飞 panjf@ict.ac.cn
嵌入式 Linux 应用
嵌入式 Linux 的特点 OpenSource Tiny 一个功能完备的 Linux 内核要求大约 1 MB 内存 Linux 系统甚至可以仅使用 256 KB ROM 和 512 KB RAM 进行工作 可移植性 模块化
Linux 系统组成 硬件平台 Bootloader Linux 内核 文件系统
基于 NFS 的嵌入式软件开发流程 配置 TFTP 服务配置 NFS 服务制作开发环境的 rootfs 基于该 rootfs 进行内核移植裁剪等工作用 pmon2000 启动内核进行调试开发制作嵌入式 rootfs, 如 busybox 交叉编译开发应用软件, 在 NFS 系统上调试烧写内核和文件系统测试
Bootloader 初始化基本硬件 下载内核 传递参数 root video ip memsize
Linux 根文件系统 root 文件系统唯一性, 文件系统的入口基本目录结构 /bin: 存放 Linux 最基本的可执行程序 /sbin: 存放系统管理员使用的可执行程序 /dev: 存放所有的设备文件 /proc: 系统运行信息, 实际存储在内存中 /usr: 用户应用程序和文件 /etc: 存放系统配置和启动脚本 /lib: 存放系统和应用程序运行所需要的动态链接库
嵌入式文件系统 busybox 将许多常用的 Linux 命令和工具结合到了一个单独的可执行程序 busybox 中 所有命令都是指向 busybox 的链接 例如 ln s busybox ls 即可生成 ls 命令 生成的整个文件系统只有 1M 大小 官方网站 www.busybox.net
实验 : 配置交叉编译 busybox make menuconfig 编译 makefile CROSS_COMPILE?= mipsel-linuxmake make install _install 目录
嵌入式 GUI(1) 桌面 Linux 图像系统 X Windows 系统 (XFree86 或者 Xorg) 作为显示界面的基础 GNOME 或者 KDE 作为桌面环境 需要比较多的资源 (RAM 和存储空间 ) X Window System : 5MB RAM, 16MB disk GNOME : 14MB RAM, 95MB disk KDE : 11MB RAM, 96MB disk Mozilla : 12MB RAM, 26MB disk 嵌入式 GUI 系统 TinyX Qt/Embedded
嵌入式 GUI(1)--TinyX TinyX 是一个针对嵌入式系统设计的 X Window, 相对 PC 版的 X Window 而言, 它占用的资源要少很多, 服务器程序仅 700 多 K, 客户端的动态库约 2M 多 ( 根据需要而定 ) TinyX 并不是一个独立的软件包, 而是 X Window 的一种编译配置所有能够在标准 X 下运行的程序都能移植到 tinyx 上从字符界面到启动 tinyx 只需要 2 秒左右的时间不需要 libc, 兼容任何 Linux 版本 http://www.xfree86.org
嵌入式 GUI(2)--QTE/Qtopia 因为 Qt 是 KDE 等项目使用的 GUI 支持库 Qt/Embedded 是面向嵌入式系统的 Qt 版本许多基于 Qt 的 X Window 程序可以非常方便地移植到 Qt/Embedded 版本上 Qtopia and Qt/Embedded -- Qtopia 是一个用于 PDA, 掌上电脑和网络应用产品的移动设备窗口环境和应用套件, 它基于 Qt/Embedded, 包括 PIM 应用程序,Internet 客户端, 娱乐和游戏程序, Qtopia/PDA 可使用商业版权或者开源协议, 但 Qtopia Phone Edition 只能用于商业
嵌入式 GUI(3)--QTE/Qtopia PDA 版本 Phone 版本
编译器介绍 Binutils: Binutils 是一组开发工具, 包括连接器, 汇编器和其他用于目标文件和档案的工具 包括下列程序 : addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings 和 strip GCC: GNU 提供的编译器家族, 它能够支持 C, C++, Objective-C, Fortran, Java 和 Ada 等等程序设计语言 Glibc GNU 提供的标准库函数 嵌入式 C 库, 如 :uclibc 体积更小 兼容 glibc
实验一 : 聚芯 Linux 内核交叉编译环境 mipsel 工具链 安装 tar -jxvf jx_linux_cross.tar.bz2 一定要解压到根目录下然后设置环境变量, 可执行路径加到 PATH PATH=$PATH: :/Cross/target/local/bin export PATH
交叉编译工具介绍 ( 一 ) mipsel-linux-gcc: 交叉编译的 c 编译器 mipsel-linux-ld: 交叉编译的链接工具 mipsel-linux-objcopy: 目标文件格式转换, 支持 BIN ELF 文件格式, 例如 : mipsel-linux-objcopy -O binary vmlinux vmlinux.bin Mipsel-linux-objdump: 显示从 elf 文件中的反汇编, 例如 : mipsel-linux-objdump ald vmlinux>linux.s ( 具体参数可以通过 man mipsel-linux-objdump 来查看帮助 )
交叉编译工具介绍 ( 二 ) mipsel-linux-nm: 列出 elf 文件的符号表信息, 例如 : System.map 文件就是由 mipsel-linux-nm 生成 mipsel-linux-readelf: 生成 elf 文件信息及其内部各段信息 mipsel-linux-size: 列出 elf 文件各个段的大小及其位置, 如 text data 和 bss 段 ( 用于为全局和静态变量保留空间, 数据静态内存分配区域 ) Mipsel-linux-strings: 列出 elf 文件中的字符串常量
其它相关工具 ldd: 列出程序或者命令所需要的共享库 ldconfig 是一个动态链接库管理命令 ldconfig 命令的用途, 主要是在默认搜寻目录 (/lib 和 /usr/lib) 以及动态库配置文件 /etc/ld.so.conf 内所列的目录下, 搜索出可共享的动态链接库 ( 格式如前介绍,lib*.so*), 进而创建出动态装入程序 (ld.so) 所需的连接和缓存文件. 缓存文件默认为 /etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表
实验二 : 开发环境之 tftp 服务器配置 /etc/xinetd.d/tftp service xinetd restart
实验三 : 开发环境之 NFS 服务器配置 /etc/exports service nfs restart mount -t nfs 10.2.2.10:/nfsroot/redhat /mnt/nfs
Linux 内核版本 版本号 :x.yy.zz 例如 :2.4.17 yy 为偶数表示发行版
Linux 基本体系结构
Linux 内核结构
Linux 内核源码 Arch: 含了此核心源代码所支持的硬件体系结构相关的核心代码 Include: 包括了核心的大多数 include 文件 另外对于每种支持的体系结构分别有一个子目录 init : 此目录包含核心启动代码 Mm: 包含了所有的内存管理代码 与具体硬件体系结构相关的内存管理代码位于 arch/*/mm 目录下. Drivers: 系统中所有的设备驱动都位于此目录中 它又进一步划分成几类设备驱动, 每一种也有对应的子目录, 如声卡的驱动对应于 drivers/sound Ipc: 此目录包含了核心的进程间通讯代码 Fs:Linux 支持的文件系统代码 不同的文件系统有不同的子目录对应, 如 ext2 文件系统对应的就是 ext2 子目录 Kernel: 主要核心代码 同时与处理器结构相关代码都放在 arch/*/kernel 目录下 Net: 核心的网络部分代码 里面的每个子目录对应于网络的一个方面 Lib: 此目录包含了核心的库代码 与处理器结构相关库代码被放在 arch/*/lib/ 目录下 Scripts: 此目录包含用于配置核心的脚本文件 Documentation: 此目录是一些文档, 起参考作用
实验四 : 聚芯内核源代码介绍
实验五 : 聚芯内核裁剪.config jx_config 配置结构解析 增加配置选项
实验六 : 聚芯 Linux 内核编辑 编译生成文件 Vmlinux:elf: 格式的内核文件 Vmlinux.bin: 二进制格式的内核文件 System.map: 内核符号表地址
聚芯内核参数设置 Root Video video=icte32:lcd_or_vga:x:disp_mod:x NFS root=/dev/nfs ip=<client-ip>:<server-ip>:<gw-ip>:<netmask> nfsroot=[<server-ip>:]<root-dir>
实验七 : 启动 Linux