嵌入式Linux知识培训主要包括以下四部分内容:一、嵌入式Linux开发的基本知识二、Linux下使用C语言进行系统开发三、面向嵌入式Linux的GUI系统的体系结构及二次开发四、基于LinuxOSSmartPhone的体系结构及开发内容李玉东第一部分基础知识嵌入式Linux有关知识培训(基础部分)嵌入式Linux软件系统的构成1.BootLoader2.Kernel3.FileSystem4.GUI5.Application嵌入式Linux有关知识培训(基础部分)嵌入式Linux系统的构成(BootLoader)1.PC机的系统引导过程系统加电跳转到固定地址BIOSMBRKernel2.嵌入式系统中的bootloader与PC机的引导程序是类似的系统加电跳转到固定的地址读入bootloader程序初始化系统加载kernel,将系统的控制权转到kernel.3.bootloader与机器硬件紧密相关。4.有一定通用性的bootloader程序uboot需要根据机器的情况进行修改嵌入式Linux有关知识培训(基础部分)典型的空间分配结构Creating4MTDpartitionsonPXACerfFlash:0x00000000-0x00040000:Bootloader0x00040000-0x000c0000:PartitionTables0x000c0000-0x001c0000:Kernel0x001c0000-0x02000000:Filesystem嵌入式Linux有关知识培训(基础部分)MultiStageBootLoader由于BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。嵌入式Linux有关知识培训(基础部分)BootLoaderStage1BootLoader的stage1通常包括以下步骤(以执行的先后顺序):·硬件设备初始化。·为加载BootLoader的stage2准备RAM空间。·拷贝BootLoader的stage2到RAM空间中。·设置好堆栈。·跳转到stage2的C入口点。嵌入式Linux有关知识培训(基础部分)BootLoaderStage2BootLoader的stage2通常包括以下步骤:·初始化本阶段要使用到的硬件设备。·检测系统内存映射(memorymap)。·将kernel映像和根文件系统映像从flash上读到RAM空间中。·为内核设置启动参数。·调用内核。嵌入式Linux有关知识培训(基础部分)BootLoader调用内核BootLoader调用Linux内核的方法是直接跳转到内核的第一条指令处开始执行如果系统显示UncompressingLinux.......................................................................done,bootingthekernel.说明Bootloader已成功加载了kernel,Kernel开始启动嵌入式Linux有关知识培训(基础部分)嵌入式Linux有关知识培训(基础部分)Kernel启动过程检查rootdevicemountrootfilesystem.如果rootfilesystem中,/linuxrc存在的话,就会被执行。/linuxrc就是一般所说的linux的启动脚本#!/bin/shexportPATH=/bin:/sbin:/usr/binechoSettingupRAMFS,pleasewait...mounttmpfs/mnt/ramfs-ttmpfstarzxvf/.ramfs.tar.gz-C/mnt/ramfs/dev/null2&1mount-n/proc/proc-tprocecho-enshowthepictures/usr/local/bin/fbctl2&//setupbackgroundlightechodoneechoExecuting/sbin/init...exec/sbin/init嵌入式Linux有关知识培训(基础部分)Kernel启动过程exec/sbin/initInit根据/etc/inittab中的内容启动相应的程序这里有一个重要参数:RunLevel例:id:2:initdefault:则RunLevel为2执行的内容为:/etc/rc2.d下面的内容实际上rc*.d下的内容都是符号链接,都指向/etc/init.d下面的内容Rc*.d下的程序是按字母顺序执行的嵌入式Linux有关知识培训(基础部分)开发环境的建立服务器的安装客户端需安装的程序嵌入式Linux有关知识培训(基础部分)开发环境的建立Linux服务器Windows工作站开发板嵌入式Linux有关知识培训(基础部分)交叉编译器为什么要安装交叉编译器ARM-LINUX交叉编译器的下载与安装下载地址:内核编译器=4嵌入式Linux有关知识培训(基础部分)内核的下载1、内核的版本号2、内核的下载地址、ARMPatch的下载地址、OMAPPatch的下载地址、最新的OMAPKerenl的下载方法BitKeeper工具以下文档中有详细介绍=swpa011嵌入式Linux有关知识培训(基础部分)内核的解压及Patch的使用方法以InnovatorDevelopmentKitforOMAPPlatform为例:1、解压内核包:tar–xzvflinux-2.4.19.tar.gz2、使用Patchpatch–p1/root/patch-2.4.19-rmk7patch–p1/root/patch-2.4.19-rmk7-omap1注:使用Patch以后将修改内核源代码中的部分内容嵌入式Linux有关知识培训(基础部分)内核的编译不同内核版本的编译方法有一些不同1、以2.4.18的内核的编译为例:makemenuconfigmakedepmakecleanmakezImagemakemodulesmakemodules_install2、P2sample(OMAP730)内核的编译方法cp$(LinuxPath)/arch/arm/configs/omap_perseus2_730_defconfig$(LinuxPath)/.configmakeold_configmakezImagemakemodulesmakemodules_installINSTALL_MOD_PATH=rootfs嵌入式Linux有关知识培训(基础部分)内核的编译内核生成后,位于以下的路径中:$(linux_path)/arch/boot/zImage可将生成的内核image文件直接下载到嵌入式开发板中嵌入式Linux有关知识培训(基础部分)Linux根文件系统(Rootfs)Linux支持的文件系统包括:ext2、ext3、vfat、iso9660、proc….嵌入式Linux中常用的文件系统包括:CramfsRamDiskJffs2TheJournallingFlashFileSystem,version2嵌入式Linux有关知识培训(基础部分)虚拟文件系统VFS系统启动过程中可以看到:VFS:Mountedroot(jffs2filesystem)将jffs2文件系统mount到VFSLinux文件管理系统调用接口VFSExt2VFATNFSProc嵌入式Linux有关知识培训(基础部分)虚拟文件系统VFS在/etc/fstab文件中,列出了系统启动时自动mount的文件系统。例如:#devicemountpointfilesystemtypeoptionsdumpfsckorder/dev/mtdblock3/jffs2defaults11ramdiskmnt/ramdisktmpfssize=10m00proc/procprocdefaults00注:其中将jffs2文件系统mount到VFS的“/”上,而对应的设备是:/dev/mtdblock3重新MountRootfs嵌入式Linux有关知识培训(基础部分)设备驱动程序设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作设备驱动程序是内核的一部分设备驱动程序是在核心态执行的驱动程序或者在编译内容时直接编译到内核中,或者在生成内核以后将驱动程序编译成模块,然后通过insmod加入到内核中嵌入式Linux有关知识培训(基础部分)设备驱动程序一般结构structfile_operations{int(*seek)(structinode*,structfile*,off_t,int);int(*read)(structinode*,structfile*,char,int);int(*write)(structinode*,structfile*,off_t,int);int(*readdir)(structinode*,structfile*,structdirent*,int);int(*select)(structinode*,structfile*,int,select_table*);int(*ioctl)(structinode*,structfile*,unsinedint,unsignedlongint(*mmap)(structinode*,structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structinode*,structfile*);int(*fasync)(structinode*,structfile*,int);int(*check_media_change)(structinode*,structfile*);int(*revalidate)(dev_tdev);}驱动程序的主要任务就是填充这个结构嵌入式Linux有关知识培训(基础部分)设备驱动程序中两个重要函数intinit_module(void)就是向系统的字符设备表登记了一个设备当使用insmod加入模块时,该函数被调用voidcleanup_module(void)它释放字符设备在系统设备表中占有的表项在用rmmod卸载模块时,cleanup_module函数被调用嵌入式Linux有关知识培训(基础部分)设备驱动程序编译设备驱动程序gcc-DMODULE-D__KERNEL__-ctest.c得到的test.o就是设备驱动程序设备文