1、第一章 概述1、 Linux 是一个类 unix 的操作系统。2、 Linux 是指最初由 Linus Torvalds 所撰写的操作系统内核,现在用于指一个完整的系统。3、 嵌入式系统分类: 小型:运算能力低的 CPU,至少 4MB 的 ROM(NOR Flash 或者 Nand Flash) ,816MB 的 RAM。 中型:中运算能力的 CPU,32MB 或者更多的 ROM(大多是 Nor 或 Nand Flash) ,64128MB 的 RAM。 大型:运算能力强大的 CPU,或者多个 CPU,大量的 RAM 以及 ROM。4、 时限:严格和宽松5、 建立目标 linux 、决定系统组
2、件。 、设定及建立内核。 、建立根文件系统。 、设置引导软件与配置。第二章 基本概念1、 主机/目标开发设置类型: 、连接式设置 、可抽换存储设备设置 、独立式设置2、 嵌入式 Linux 系统的一般架构:上层:应用程序(也包括各类库) 。中层:linux 内核(高层抽象层、文件系统、网络协议、底层接口层) 。下层:硬件。3、 系统启动过程: 、引导加载程序:底层硬件初始化后直接跳到内核启动程序代码执行。 、内核:为自己进行初始化,跳到 start_kernel,初始化高层的内核功能、挂载跟文 件系统以及启动 init 进程。 、init 进程:系统启动的第一个进程,其余进程都是这个进程的子进
3、程。4、 引导配置类型: 、固态储存媒体设置 、磁盘设置 、网络设置5、 系统的存储器配置:虚拟地址和物理地址。第三章 所支持的硬件1、 处理器架构: ARM、AVR32、INTEL X86、M32R、MIPS、MOTOROLA 68000、POWERPC 等。2、 总线与接口: PCI/PCI-X/PCIe、ExpressCard、PC/104 、SCSI、USB、I2C、I/O、串口、并口等等。第四章 开发工具1、 构建项目工作空间:bootldr、bulid-tools、debug、doc、image、kernel 、project、rootfs、sysapps 、tmp、tools 等
4、。2、 GNU 跨平台开发工具链:编译器、汇编器、连接器、打包器、程序库和头文件等。 Linux 内核头文件。 Binutils:as、ld 、gasp、ar、nmu、objcopy、objdump、ranlib、readelf 、size、strings、strip、C+filt、addr2line 等。 C 程序库:glibc 库。 线程程序库:3、 手动构建一个工具链此步骤比较繁琐,暂时不建议学习。4、 还有一些其他的内容,不做详细的介绍,只是简单的了解即可。5、 Eclipse: 安装 Eclipse安装免费的 JVM安装 Eclipce IDE for C/C+ Decelopers
5、。 执行 EclipseEclipse &,首先设置工作目录。 扩展 Eclipse安装插件:Target Management 工具集和 Subclopse。 使用 Eclipse第五章 内核方面的考虑1、 选择内核:和通透:http:/www.kernel.org 网站下载。a) 嵌入式内核:b) 2.4 系列内核:被 2.6 系列的内核取代了。c) 2.6 系列内核:使用稳定版本的压缩文件,使用 git 追踪内核的发展。2、 设定内核配置:配置生成.config 文件a) 配置选项:make menuconfig 后的内核配置选项功能的选择。b) 配置设定方法:make config、m
6、ake oldconfig、make menuconfig、make xconfig 等。c) 管理多种配置。3、 编译核:a) 构建内核Make ARCH=arm CROSS_COMPILE=arm-linux- zImageb) 构建模块Make ARCH=arm CROSS_COMPILE=arm-linux- modulesc) 回到初始状态Make ARCH=arm CROSS_COMPILE=arm-linux- distclean目前可以直接用:make zIamge 来直接生成内核和模块。4、 安装内核模块:a) 管理多个内核镜像b) 安装内核模块5、 实地测试:第六章 根文件
7、系统的内容1、 根文件系统的基本构造a) 根文件系统的顶层目录:bin、boot 、dev、etc、home、lib、media、mnt 、opt、proc、root、sbin、sys、tmp、usr、 var。bin、dev 、lib、proc、sbin、usr 都是不可或缺的。home、mnt 、opt 、root 都是可以省略的。tmp、var 也是可省略,但不建议,可能会危害某些软件运行。proc、sys 极端情况下也可以省略2、 程序库a) glibc组件:ld:动态连接器 libBrokenLocal:修正函数libSegFault:捕捉存储断错误 libanl:异步名称查询函数l
8、ibbsd-compat:假程序库 libc:主要的 c 程序库函数libcrypt:密码学函数 libdl:动态载入共享目标文件libm:数学函数 libthread:线程函数librt:异步 I/O 函数 libutil:登陆函数。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。不一一介绍了。b) 找出某个程序使用的动态库:ldd 、工具链的 readelfc) 瘦身:strip3、 uClibc4、 内核模块5、 内核映像6、 设备文件 静态设备文件:在文件系统中只需要建立一次。 动态设备文件 udev构建 udev:下载 udev 源码包,解
9、压,编译Make CROSS_COMPILE=powerpc-linux- DESTDIR=*/rootfs install启动 udev:mount t tmpfs udev /dev (动态设备文件)Cp a f /libu/udev/device/* /dev (静态设备文件)Udev daemon &Udev 运行原理:udev 等待来自黑河的 driver core 子系统的 uevents 事件,每当有设备被插入或移除,这些信息就会被送出。当 udevd 收到此类事件,udevd 会启动一个进程以便:根据 udev 规则对比事件,找到相符的命名规则,建立或移除设备文件,找到相符的规
10、则时,执行所指定的命令。内核通过 netlink sickets 传送 uenvent。是非同步的,排入队列。Udev 规则:冷插拔:内核配置:支持热插拔(CONFIG_HOTPLUG=y) 、支持网络功能(CONFIG_NET=y,CONFIG_UNIX=y,CONFIG_NETFILTER_NETLINK=y ,CONFIG_NETFILER_NETLINK_QUEUE=y) 、虚拟文件系统(CONFIG_PROC_FS=y,CONFIG_SYSFS=y,CONFIG_TMPFS=y,CONFIG_RAMFS=y)轻量级的 udev 实现品:BusyBox mdev:启动:1、挂载/sys
11、:mount t sysfs none /sys2、将一个 tmpfs 文件系统挂载到 dev:mount t tmpfs mdev /dev3、指示内核,每当有热插拔时间发生时,就调用 /bin/mdev:Echo /bin/mdev /proc/sys/kernel/hotplug4、将已经在/sys 中找到的设备复制到/dev :mdev s说明:mdev 也依赖于原来的热插拔基础设施。不使用 netlink socket,不会永久占 RAM 的存储空间。不具备命名能力,只会使用从/sys 找到的原始设备信息来命名设备文件。7、 主要的系统应用程序:主要是一些二进制命令的选择。 、完整的
12、标准应用程序。这个比较繁琐,不提倡。 、BusyBox 来选在构建,这个比较流行的方法。a) 简介:busybox 包含:大部分的 Unix 命令,DHCP 客户端和服务器,套件管理器,vi,web 服务器。比较简单,可以静态或者动态的链接 glibc 或 uClibc。b) 设置:make xconfig、make gconfig、make menuconfig、make defconfig、make allnoconfig、make oldconfig 等。c) 编译:主要选项是 CONFIG_STATIC,是静态编译还是动态编译。一般喜欢在make menuconfig 时将交叉编译器、
13、输出目录和静态或者动态设置好。d) 使用:目标文件系统上只安装了一个二进制文件,大部分的命令式只想busybox 的符号链接。ln s /bin/busybox /bin/reboot 等。也可以在编译的时候选择硬链接。PATH 变量和 LD_LIBRARY_PATH 变量。e) TinyLogin:busybox 登陆工具程序。f) Embutils:功能与 busybox 类似,但没有 busybox 强大。就不详细介绍了。8、 定制应用程序:可以放到指定目录或者自己重新建一个目录,修改相应的 PATH 变量。9、 系统初始化:内核最后一个初始化动作就是启动 init 程序。此程序会启动各
14、种应用程序以及若干组件。Init 分类讨论: 标准的 System V initMiquel van Soorenburg 所撰写的 init 套件,可以让你进行目标系统的设置的时候,获得如同设置工作站或服务器一般的弹性,下载:ftp:/ftp.cistron.nl/pub/people/miquels/sysvinit交叉编译:Make CC=powerpc-linux-gcc安装:Make BIN_OWNER=”$(id -un)” BIN_GROUP=”$(id -gn)” ROOT=$(PRJROOT)/rootfs install执行后会失败,因为 Makefile 还会试着把 ma
15、npage 安装到根文件系统,修改其避免这个状况。使用 init,需加入适当的/etc/inittab(为系统定义运行级别)和/etc/rc.d/(每一个级别运行的服务) 。有 7 个级别:0 :终止系统的运行。 1:单一用户模式,不需要 login。2:多用户模式但不支持 NFS,使用命令行形式的login。3:多用户模式,使用命令行形式的 login。4 :不使用。5:X11,图形界面。6:重启。大多数工作站为 5,可以使用 init 或者 telinit 命令来修改启动后的运行级别,会听过/dev/initctl 这个 fifo 来与原始的 init 进程通信。 Busybox init
16、Busybox 的 init 进程会做以下工作:1、 为 init 设置信号处理程序2、 初始化控制台(/dev/console)3、 解析 inittab 文件(/etc/inittab)4、 执行系统初始化命令脚本(/etc/init.d/rcS)5、 执行所有会导致 init 暂停的 inittab 命令(wait)6、 执行所有仅执行一次的命令(once)一旦完成以上步骤,init 进程便会以无穷循环来执行以下工作:1、 执行必须重新启动的所有 inittab 命令(动作命令:respawn)2、 执行必须重新启动但启动之前必须向用户询问的 inittab 命令(动作命令:askfir
17、st)3、 等待子进程Inittab 文件分析:1、 控制台初始化后,busyboxh 会检查/etc/inittab 是否存在,如果不存在则会使用预订的 inittab 配置。会为系统重新引导、系统终止运行以及 init 重启动设定预定的动作等。2、 如果存在,则会解析,并将其中的命令记录在适时执行。3、 每一行的格式:id:runlevel:action:process。4、 Action:sysinit、respawn、askfirst、wait、once、ctrlaltdel、shutdown、restart。 Minit:因为用的不广。这里不做详细介绍。第七章 存储设备管理1、 MT
18、D 子系统 MTD 的基本用法a) MTD “/dev 项目”a) 传统的 Unix 只知道两种设备类型:字符和块。b) MTD 通过一个字符设备 /dev/mtfN 来进行读写或者 ioctl 擦除等。c) 每个 mtdN 设备的次要编号为 N*2,相应的只读设备的次要编号为N*2+1。d) “转换层”让 Flash 设备被当成标准块设备使用,例如 mtdblock 驱动程序。b) 设定内核配置a) 进入 MTD 子菜单Device D1river -Memory Technology Device(MTD) -Memory Technology Device (MTD) support (
19、支持 MTD 子系统,必选)MTD concatenating support (支持多个 MTD 设备或分区合成单一逻辑设备)MTD partitioning support (支持 MTD 设备能够被划分成各个独立的分区)Direct char device access to MTD devices (字符设备 MTD 用户模块)caching block device access to MTD devices (读写块设备 MTD 用户模块 )Readonly block device access to MTD devices (读写块设备 MTD 用户模块 ,与上面只能有一个存在
20、)FTL (Flash Translation Layer) support (支持 FTL 用户模块)NFTL (NAND Flash Tranlation Layer) support (支持 NFTL 用户模块)RAM/ROM/Flash chip driver - (一些芯片的驱动)Mapping drivers for chip access - (mapping 驱动程序的配置选项)Self-contained MTD device drivers - (不属于 NOR、NAND、OneNAND 框架的驱动配置)NAND Device Support - (NAND Flash 设
21、备的配置选项)OneNAND Device Support - (OneNAND Flash 设备的配置选项)b) 设置配置选项。注意这里配置后的选项必须是构成内核的一部分,而不是模块(前面选* ,而不是 M) ,不然当你的目标文件系统是以固态一存储设备挂载的话,就找不到文件系统。c) MTD 工具程序a) 一般工具:flash_info device(列出设备与擦除范围有关的信息)flash_erase device start_address number_of_blocks(地址开始,从设备擦除一定数量的块)flash_eraseall option device(擦除整个设备)flas
22、h_unlock device(为设备的所有区段解锁)flash_lock device offset number_of_blocks(锁住设备上一定数量的块)flashcp option filename flash_device(将文件复制到 flash_device 快闪设备上)doc_loadbios device firmware_file(将 bootloader 写入设备的引导区)mtd_debug operation operation_parameters(提供有用的 MTD 调试操作)b) 文件系统建立工具:Mkfs.jffs2 options r directory o
23、 output_file (从目录开始建立一个 JFFS2文件系统镜像)Sumtool options I input_file o output_file (处理一个 JFFS2 文件系统镜像)c) NFLT 工具: nftldump device output_filed) FTL 工具: ftl_format options device、ftl_check option devicee) NAND 芯片工具:Nandwrite device input_file start_address:将一个文件的内容写入一个NAND芯片。Nandtest device:测试 nand 芯片Nan
24、ddump device output_file offset number_of_bytes:将 Nand 芯片内容转移到文件中。d) 为主机系统安装 MTD 工具程序:1、 将 git 树复制到指定文件夹,进入之后,make 编译。2、 Make DESRDIR=$(PREFIX) install,安装到指定目录。e) 为目标系统安装 MTD 工具程序:1、 下载 zlib、lzo、libacl 到指定目录,分别解压2、 安装 libz 库: 进入目录 zlib-1.2.3 设置交叉编译工具链CC=i386-linux-gcc LDSHARED=”i386-linux-ld -shared
25、” ./configure -shared 编译MakeMake prefix=$(TARGET_PREFIX) install 复制:Cp d libz.so* $(PRJROOT)/rootfs/lib3、 安装 liblzo:与 libz 同理4、 安装 libacl:同理,但是要先下一个 acl.h 的头文件。 本地的 CFI Flash 设备NAND Flash:擦除块,起初都是 1,写入数据即写入 0,擦除必须将整个块都设为1。NOR Flash:相比 NAND Flash 而言,可以每个位可以被个别设为 0。a) 内核的设定:1、 参照之前 MTD 设备的设定:MTD 支持、MT
26、D 分区支持、MTD 字符设备选项、MTD 读写块设备选项、芯片选择子菜单里的 Detect flash chips by Common Flash Interface(CFI) probe 选项、mapping 驱动子菜单的特定卡的 CFI Flash Common Flash driver 选项。b) 进行分区:1、 不能使用 fdisk 之类的工具来分区,设备的分区信息会硬编码在mapping 驱动程序里,或者板子的设备树中,并且会在设备初始化期间向 MTD 子系统注册。2、 Mapping 驱动程序注册分区的分区信息是在板级文件上arch/arm/mach-XXX/board-XXX.
27、c。3、 注册时主要成员是:name、offset 、size。4、 可以 cat /proc/mtd 来查看分区。5、 擦除必须考虑到“擦除块”的大小。 必要的/dev 项目根据分区的个数在你的 rootfs 的/dev 下建立相应的节点,列入神弋 DM6446 的nand flash 分 9 个区,则建立节点 mtdblock0mtdblock8。Mknod mtdblock0 b 31 0 . 擦除、写入与读出第八章 根文件系统的设置1、 嵌入式设备的文件系统类型:a) 文件系统的特性:支持在线写入、持久性、断电可靠性、可压缩b) 文件系统类型:Ext2:可写入、具有持久性、可被构建成使
28、用块设备的文件系统。不提供断电可靠。Ext3:是 ext2 的扩充,增加了日志文件。Cramfs:极简单、经压缩的只读文件系统。限制:每个文件大小不可超过 16MB、不提供. 和.的目录选项、最多 255 个群组、时间戳为 Unix 纪元、只有分页大小为 4096 字节的内核才可以读取、无法移除文件。Squashfs:具有 cramfs 的许多优点,但没有 cramfs 所受到的限制。缺点是不是内核树的一部分,需使用补丁。JFFS2:可写入、持久、经压缩、具有断电可靠性的文件系统。YAFFS2:可写入、具有持久性和断电可靠性的文件系统。Tmpfs:虚拟存储器为基础的文件系统。2、 放在 RAM
29、 disk 上的磁盘文件系统:3、 Rootfs 与 initramfs4、 应用程序、程序库和静态数据第九章 设置 bootloader1、 嵌入式 bootloader:LILO、GRUB、 Loadlin、Coreboot、Uboot、RedBoot2、 网络引导的服务器设置:a) DHCP 服务:动态 IPb) TFTP 服务:供下载内核镜像c) NFS 服务:挂载根文件系统3、 使用 uboota) 编译和安装第一步、uboot 的构建配置:make DM6446_config第二步、设置交叉编译工具链后编译:可以直接在 Makefile 中修改。也可以直接命令编辑:Make ARC
30、H=arm CROSS_CMPILE=arm-linux- u-boot.udfub) 使用 uboot 引导c) 配置 uboot 变量d) 建立引导命令脚本:bootcmd 和 bootargs第十章 设置网络服务1、 目标系统网络配置:例如脚本文件(静态 IP):#!/bin/shHOSTNAME= shuDOMAINNAME = IP=192.168.0.1.2NETMASK=255.255.255.0GATEWAY=192.168.1.1NS1=192.168.1.200echo 127.0.0.1 $HOSTNAME.$DOMAINNAME $HOSTNAME /etc/hosts
31、/bin/hostname $HOSTNAME/sbin/ifconfig lo 127.0.0.1 up/sbin/route add net 127.0.0.1 netmask 255.0.0.0 lo/sbin/ifconfig eth0 $IP up/sbin/route add net $GATEWAY netmask $NETMASK eth0echo nameserver $NS1 /etc/resolv.conf2、 DHCP 动态配置3、 网络超级服务器Inetd 和 xinetd4、 SNMP 远程管理5、 Telnet 网络登录6、 SSH 安全通信7、 HTTP 提供 Web 内容Boa、thttpd 、apache第十一章 调试工具1、 Eclipse2、 GDB3、 追踪:单进程追踪:strace。系统追踪:LTTng后面的是实时操作系统,暂时不做学习