《嵌入式Linux操作系统移植.ppt》由会员分享,可在线阅读,更多相关《嵌入式Linux操作系统移植.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、最新的最新的LinuxLinux内核版本可以从官方站点获取。内核版本可以从官方站点获取。因为嵌入式因为嵌入式LinuxLinux系统在开发过程中需要对系统在开发过程中需要对LinuxLinux内核进行重新定制,所以熟悉内内核进行重新定制,所以熟悉内核配置、编译和移植是非常重要的。核配置、编译和移植是非常重要的。1.Linux1.Linux内核的版本内核的版本 Linux Linux内核的版本号分为主版本号、次版本号和扩展版本号等。根据稳定版内核的版本号分为主版本号、次版本号和扩展版本号等。根据稳定版本、测试版本和开发版本定义不同版本序列。本、测试版本和开发版本定义不同版本序列。9.1 9.1
2、嵌入式嵌入式LinuxLinux基本概念基本概念 2.Linux系统的分类 (1)以功能差异和发行组织分类l标准标准linuxlinux。lClinuxClinux。无。无MMUMMU支持的支持的linuxlinux系统,运行在无系统,运行在无MMUMMU的的CPUCPU上。上。Linux-RTLinux-RT。是最早在。是最早在linuxlinux上实现硬实时支持上实现硬实时支持的的linuxlinux发行版本。发行版本。lLinux/RTAILinux/RTAI。lEmbedixEmbedix。由。由LineoLineo公司开发,基于公司开发,基于PowerPCPowerPC和和x86x8
3、6平台平台开发的。开发的。Red Hat LinuxRed Hat Linux。l红旗红旗LinuxLinux等。等。(2 2)以应用的嵌入式平台分类)以应用的嵌入式平台分类 在嵌入式在嵌入式LinuxLinux系统开发过程中,内核移植是将系统适系统开发过程中,内核移植是将系统适合于自己特定的硬件平台系统的重要步骤,只有引导合于自己特定的硬件平台系统的重要步骤,只有引导内核完毕,才能运行用户应用程序。内核完毕,才能运行用户应用程序。9.1 9.1 嵌入式嵌入式LinuxLinux基本概念基本概念3.Linux内核组成:内存管理、进程调度、虚拟文件系统、网络接口、进程间通信.Linux内核由进程
4、管理、内存管理、虚拟文件系统、网络接口和进程间通信五大子系统组成,各个子系统之间的依赖关系如下图所示。9.1 9.1 嵌入式嵌入式LinuxLinux基本概念基本概念内存管理内存管理虚拟文件系统虚拟文件系统进程调度进程调度网络接口网络接口进程间通信进程间通信9.1 9.1 嵌入式嵌入式LinuxLinux基本概念基本概念LinuxLinux系统结构层次系统结构层次可以发现Linux内核中各个系统之间有如下关系:(1)进程调度处于中间。(2)进程调度与内存管理的依赖关系(3)进程间通信依赖于内存管理。(4)虚拟文件系统与网络接口之间的关系。(5)内存管理与虚拟文件系统之间的关系。9.1 9.1
5、嵌入式嵌入式LinuxLinux基本概念基本概念Linux内核源码非常庞大,采用C语言和少量汇编实现,并且随着版本的发展不断增加。源码的工程管理采用目录树结构,并使用Makefile组织配置编译。获得新的Linux2.6内核源码之后,一般首先仔细阅读顶层目录的README文件,了解对内核的概述和编译命令说明。顶层目录中另一个比较重要的文件是Makefile,它是整个内核配置编译的核心文件,负责组织目录树中的子目录的配置编译管理,还决定了体系结构和内核版本号等。9.2 Linux9.2 Linux内核源码结构内核源码结构 Linux内核源码非常庞大,采用C语言和少量汇编实现,并且随着版本的发展不
6、断增加。源码的工程管理采用目录树结构,并使用Makefile组织配置编译。获得新的Linux2.6内核源码之后,一般首先仔细阅读顶层目录的README文件,了解对内核的概述和编译命令说明。顶层目录中另一个比较重要的文件是Makefile,它是整个内核配置编译的核心文件,负责组织目录树中的子目录的配置编译管理,还决定了体系结构和内核版本号等。9.2 Linux9.2 Linux内核源码结构内核源码结构9.2 Linux9.2 Linux内核源码结构内核源码结构1 1 LinuxLinux内核源代码目录结构内核源代码目录结构arch包含和硬件体系结构相关的代码,每种平台占一个相应的目录。如arm、
7、avr32、blackfin、mips等。block块设备驱动程序的IO调度。crypto常用的加密和离散算法,还有一些压缩和CRC校验算法9.2 Linux9.2 Linux内核源码结构内核源码结构Documentation内核的说明文档。drivers设备驱动程序,其下细分为不同种类的设备。如block、char、mtd、net、usb、video等等。fs内核支持的文件系统的实现,如ext2、ext3、cramfs、jffs2、nfs等。LinuxLinux内核源代码目录结构内核源代码目录结构9.2 Linux9.2 Linux内核源码结构内核源码结构LinuxLinux内核源代码目录结
8、构内核源代码目录结构include头文件。与系统相关的头文件放在include/linux下,与ARM体系结构相关的头文件放在include/asm-arm下。init内核初始化代码。ipc进程间通信代码。9.2 Linux9.2 Linux内核源码结构内核源码结构LinuxLinux内核源代码目录结构内核源代码目录结构kernel内核的核心代码,包括进程调度、定时器等。和arm平台相关的核心代码在arch/arm/kernel目录下。lib库文件代码mm内存管理代码,和arm平台相关的内核管理代码在arch/arm/mm目录下。9.2 Linux9.2 Linux内核源码结构内核源码结构Li
9、nuxLinux内核源代码目录结构内核源代码目录结构net网络相关的代码,实现了各种常见的网络协议。scripts包含用于配置内核的各种脚本文件。只在配置时是有意义的。sound音频设备驱动的通用代码和硬件驱动代码都在这个文件件下面。Linux内核有两种映像:非压缩内核Image压缩内核zImage嵌入式系统存储容量有限,因此通常选择压缩内核zImage.要使用压缩内核zImage,需要在映像开头加入解压缩代码,将zImage解压后,才可以执行。9.2 Linux9.2 Linux内核源码结构内核源码结构2 2 LinuxLinux内核启动方案内核启动方案内核编译完成后,会在arch/arm/
10、boot目录下生成zImage文件。zImage文件的组成:pggy.o:压缩后的内核文件head.o:系统初级初始化代码文件misc.o:解压缩代码文件9.2 Linux9.2 Linux内核源码结构内核源码结构3 3 zImagezImage的构成的构成对于ARM处理器来讲,Linux内核zImage第一段代码入口位于arch/arm/boot/compressed/head.S文件中。它依次完成如下功能:初始化Cache、Mmu等设置跳转到C语言内核解压函数中 bl decompress_kernel跳转到非压缩内核启动汇编段b call_kernel9.2 Linux9.2 Linux
11、内核源码结构内核源码结构汇编部分汇编部分9.3.1 9.3.1 内核修改内核修改1.1.解压内核源码解压内核源码 使用如下命令进行加压:使用如下命令进行加压:tar jxvf tar jxvf2.2.修改修改MakefileMakefile 整个整个LinuxLinux内核工程是以内核工程是以MakefileMakefile为核心完成编译和连接的。为核心完成编译和连接的。进入内核源码目录,使用编辑工具打开一级目录下的进入内核源码目录,使用编辑工具打开一级目录下的MakefileMakefile文件,找到相文件,找到相关变量进行修改:关变量进行修改:ARCHARCH?=arm?=armCROSS
12、_COMPILECROSS_COMPILE?=arm-linux-?=arm-linux-9.3 9.3 内核移植的一般步骤内核移植的一般步骤3.修改目标板输入时钟使用编辑工具打开内核源码目录中arch/arm/mach-s3c2440/mach-smdk2440.c文件,找到函数mini2440_map_io(void)的实现代码,如下:s3c24xx_init_clocks(12000000);4修改MTD分区Linux下的MTD驱动程序接口被划分为两类模块:用户模块和硬件模块。内核MTD分区必须与Bootloader分区相一致。最后去掉ECC校验:将driver/mtd/nand/s3c
13、2410.c文件中的“NAND_ECC_SOFT,”语句将其改为“NAND_ECC_NONE;”。9.3 9.3 内核移植的一般步骤内核移植的一般步骤9.3 9.3 内核移植的一般步骤内核移植的一般步骤5.配置yaffs2文件系统的补丁YAFFS意义为yet another flash file system,也是一个开源的文件系统。YAFFS文件系统则是专门针对NAND flash的,源代码可以到上下载。使用如下命令解压补丁包:进入补丁所在目录,使用如下命令打补丁:./patch-ker.sh c 其中为linux内核源码所在目录。上面命令执行过程中相当于完成以下三项操作:(1)修改内核fs
14、/Kconfig:增加了一行:source fs/yaffs2/Kconfig(2)修改内核fs/Kconfig增加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/(3)在内核fs/目录下创建yaffs2目录9.3.2 内核配置 Linux内核版本不断更新,新的内核修订了旧内核的bug,并增加了许多新的特性。为了正确、合理、有选择地使用内核提供的模块,设置内核编译配置选项,一般主要有下面几个考虑。.节省存储空间。.节省运行空间。.减少漏洞。针对于一个新的目标系统按照上一节进行了内核的修改之后,就可以对内核进行进一步的配置工作。9.3 9.3 内核移植的一般步骤内核移植的一般
15、步骤1.内核配置工具配置工具主要包含Makefile、Kconfig和配置界面生成工具,这些项目可以由Kbuild系统调用,生成配置界面。配置界面是通过工具来生成的,工具通过Makefile编译执行,选项则是通过各级目录的Kconfig文件定义。Linux 2.6内核中Makefile分类:Kernel Makefile顶层目录下的Makefile文件.config内核配置文件arch/$(ARCH)/Makefile对应不同平台体系结构的Makefilescripts/Makefile.*所有kbuild Makefiles的通用规则等定义 kbuild Makefiles内核编译各级目录下
16、的Makefile文件9.39.3 内核移植的一般步骤内核移植的一般步骤KbuildKbuild大体上按照下列步骤执行编译过程。大体上按照下列步骤执行编译过程。l内核配置,生成内核配置,生成.config.config文件。文件。l保存内核版本信息到保存内核版本信息到include/linux/version.hinclude/linux/version.h。l创建链接符号创建链接符号include/asminclude/asm,链接,链接 include/asm-$(ARCH)include/asm-$(ARCH)源目录。源目录。l升级所有依赖的前提文件,在升级所有依赖的前提文件,在arch
17、/$(ARCH)/Makefilearch/$(ARCH)/Makefile中指定附加中指定附加依赖条件。依赖条件。l递归地遍历各级子目录并且编译所有的目标。递归地遍历各级子目录并且编译所有的目标。init-*init-*、core*core*、drivers-*drivers-*、net-*net-*、libs-*libs-*的目录变量值在的目录变量值在 arch/$(ARCH)/Makefile arch/$(ARCH)/Makefile 文文件中有些扩展。件中有些扩展。l链接所有的目标文件,生成顶层目录的链接所有的目标文件,生成顶层目录的 vmlinuxvmlinux。链接的第一个目。链
18、接的第一个目标文件在标文件在 head-yhead-y列表中,是在列表中,是在arch/$(ARCH)/Makefilearch/$(ARCH)/Makefile中定义的。中定义的。最后,体系结构相关的部分作必须的后期处理,编译生成最终的引导最后,体系结构相关的部分作必须的后期处理,编译生成最终的引导映像。这可以包括编译引导记录;准备映像。这可以包括编译引导记录;准备initrdinitrd映像等类似工作。映像等类似工作。9.3 9.3 内核移植的一般步骤内核移植的一般步骤(1 1)配置入口)配置入口在顶层的在顶层的MakefileMakefile中,可以查找到如下几行定义的规则。中,可以查找
19、到如下几行定义的规则。config%config:scripts_basic outputmakefile FORCE config%config:scripts_basic outputmakefile FORCE$(Q)mkdir-p include/linux$(Q)mkdir-p include/linux$(Q)$(MAKE)$(build)=scripts/kconfig$(Q)$(MAKE)$(build)=scripts/kconfig$(2 2)KconfigKconfig下面解释一下下面解释一下KconfigKconfig的特点和语法。的特点和语法。菜单项菜单项 菜单属性菜
20、单属性 菜单依赖关系菜单依赖关系 菜单组织结构菜单组织结构 KconfigKconfig语法语法 9.3 9.3 内核移植的一般步骤内核移植的一般步骤(3 3)内核编译方式)内核编译方式KbuildKbuild系统使用系统使用Kbuild MakefileKbuild Makefile来编译内核或模块。来编译内核或模块。Kbuild MakefileKbuild Makefile的文件名不一定是的文件名不一定是MakefileMakefile,尽管推荐使用,尽管推荐使用MakefileMakefile这个名字。这个名字。Kbuild MakefileKbuild Makefile的一个最主要功
21、能就是指定编译什么,这个功能是通过两个的一个最主要功能就是指定编译什么,这个功能是通过两个对象指定的对象指定的obj-?obj-?和和xxx-objsxxx-objs。obj-?obj-?语法:语法:obj-?=$(target).oobj-?=$(target).oxxx-objsxxx-objs指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。9.3 9.3 内核移植的一般步骤内核移植的一般步骤(4 4)配置选项)配置选项在进行配置之前,在内核目录下执行下列操作,生成平台默认配置文件在进行配置之前,在内核目录下执行下列操
22、作,生成平台默认配置文件.config.config:make s3c2410_defconfigmake s3c2410_defconfig执行完后会出现:执行完后会出现:#configuration written to.config#configuration written to.config。常规设置选项常规设置选项General setup General setup 引导模块支持引导模块支持Loadable module supportLoadable module support块设备块设备Enable the Block layerEnable the Block layer
23、处理器类型及特性处理器类型及特性Processor type and featuresProcessor type and features电源管理选项电源管理选项Power management options(ACPI,APM)Power management options(ACPI,APM)总线选项总线选项Bus optionsBus options用户可执行文件格式用户可执行文件格式Executable file formatsExecutable file formats驱动程序配置选项驱动程序配置选项Driver DriversDriver Drivers9.3 9.3 内核移植
24、的一般步骤内核移植的一般步骤9.3.3 9.3.3 内核编译内核编译 编译的步骤就是执行一些相对固定的命令目标序列。编译的步骤就是执行一些相对固定的命令目标序列。Kbuild Kbuild还提供了许多可选的配置编译目标和规则。可以使用还提供了许多可选的配置编译目标和规则。可以使用make make helphelp命令把所有的配置编译目标和说明信息打印到屏幕。命令把所有的配置编译目标和说明信息打印到屏幕。其中常用的配置编译目标有(其执行格式为:其中常用的配置编译目标有(其执行格式为:make make ):):(1 1)清理目标()清理目标(Clean targetsClean targets
25、):):(2 2)内核配置的目标()内核配置的目标(Configuration targetsConfiguration targets)(3 3)其他通用目标()其他通用目标(Other generic targetsOther generic targets)(4 4)静态解析器目标()静态解析器目标(Static analysersStatic analysers)(5 5)内核打包目标()内核打包目标(Kernel packagingKernel packaging)(6 6)文档目标()文档目标(Documentation targetsDocumentation targets)(
26、7 7)ARMARM体系结构相关的目标(体系结构相关的目标(Architecture specific targets(arm)Architecture specific targets(arm))(8 8)缺省目标)缺省目标9.3 9.3 内核移植的一般步骤内核移植的一般步骤内核编译产生了哪些目标,连接形成了哪些映像,这些映像是如何组成的,又内核编译产生了哪些目标,连接形成了哪些映像,这些映像是如何组成的,又处于处于LinuxLinux内核启动运行的哪个阶段内核启动运行的哪个阶段 1.vmlinux1.vmlinux映像:了解这个映像(映像:了解这个映像(vmlinux imagevmlin
27、ux image)的构成。)的构成。2.zImage2.zImage映像:嵌入式映像:嵌入式LinuxLinux系统的引导方式有两种,一种是上文所说系统的引导方式有两种,一种是上文所说的非压缩方式;另外一种是压缩方式。的非压缩方式;另外一种是压缩方式。zImagezImage产生的过程。产生的过程。LinuxLinux内核是一个很复杂的代码块,有许许多多的全局符号。它不使用内核是一个很复杂的代码块,有许许多多的全局符号。它不使用符号名,而是通过变量或函数的地址来识别变量或函数名。符号名,而是通过变量或函数的地址来识别变量或函数名。内核主要是用内核主要是用C C写的,编译成目标代码或者映像就可以
28、直接使用地址了写的,编译成目标代码或者映像就可以直接使用地址了。9.3 9.3 内核移植的一般步骤内核移植的一般步骤9.3.4 建立Linux根文件系统 1.文件系统介绍2.Linux文件系统:包括以下几项内容:基本的文件系统结构,包含一些必需的目录比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。基本程序运行所需的库函数,如 Glibc/uC-libc。基本的系统配置文件,比如 rc,inittab等脚本文件。必要的设备文件支持:/dev/hd*,/dev/tty*,/dev/fd0。基本的应用程序,如sh,ls,cp,mv等。9.3 9.3 内核移植的一般步骤
29、内核移植的一般步骤3.根文件系统的结构(1)/dev 设备文件。(2)/root root用户主目录。(3)/usr。(4)/var。(5)/home。(6)/proc。(7)/bin。(8)/sbin。(9)/etc。(10)/boot。(11)/lib。(12)/mnt。(13)/tmp。(14)/initrd 9.3 9.3 内核移植的一般步骤内核移植的一般步骤4.制作根文件系统(1)建立目录结构(2)编译busybox(3)创建设备节点(4)建立配置文件(5)添加共享链接库(6)制作映像9.3 9.3 内核移植的一般步骤内核移植的一般步骤9.3.5 下载目标文件 首先要通过目标板的JTAG接口将Bootloader映像下载到它的分区中 运行有Bootloader的目标板一般都具有下载操作系统内核和根文件系统的能力。下载的命令为Load,说明如下:vivi load help Usage:load|9.3 9.3 内核移植的一般步骤内核移植的一般步骤