您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 嵌入式开发-第7章 嵌入式Linux软件设计
第7章嵌入式Linux软件设计2第7章嵌入式Linux软件设计主要内容1324Bootloader引导程序Linux的移植驱动程序开发应用程序开发3第7章嵌入式Linux软件设计7.1.1Bootloader的启动过程BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。BootLoader的stage1通常包括以下步骤:硬件设备初始化。为加载BootLoader的stage2准备RAM空间。复制BootLoader的stage2到RAM空间中。设置好堆栈。跳转到stage2的入口点。BootLoader的stage2通常包括以下步骤:初始化本阶段要使用的硬件设备。检测系统内存映射。将kernel映像和根文件系统映像从Flash读到RAM中。为内核设置启动参数。调用内核。4第7章嵌入式Linux软件设计Bootloader的两种不同操作模式•启动加载模式:这种模式也称为自主模式(Autonomous)模式,即Bootloader从目标机上的某个固态存储设备上将操作系统加载到ARM中运行,整个过程没有用户的介入。这种模式是Bootloader的正常工作状态。在嵌入式产品发布时,bootloader必须工作在这种模式下。•下载模式:目标机上的Bootloader通过串口连接或网络连接等通信手段从主机上下载文件,比如下载应用程序、数据文件、内核映像等。从主机上下载的文件通常首先被bootloader保存在目标机的RAM中,然后在被Bootloader写到目标机上的固态存储设备中。这种模式主要用在系统更新时。5第7章嵌入式Linux软件设计常见的bootloader•U-bootU-boot是德国DENX小组开发的用于多种嵌入式CPU的Bootloader程序,它可以运行在基于PowerPC、ARM、MIPS等多种嵌入式开发板上。第7章嵌入式Linux软件设计常见的bootloader(continued)•BlobBlob是BootloaderObject的缩写,是一款功能强大的Bootloader。最初由Jan-DerkBakker和ErikMouw写的,现移植到很多基于ARM的CPU上。第7章嵌入式Linux软件设计常见的bootloader(continued)•ARMboot是一个以ARM或StrongARM为内核CPU的嵌入式系统的Bootloader,该软件的目标是使新的平台更容易被移植并尽可能地发挥其强大的性能。第7章嵌入式Linux软件设计常见的bootloader(continued)•RedBoot最初有Redhat开发,集bootloader、调试、flash烧写于一体,支持串口、网络下载,执行可执行应用程序。第7章嵌入式Linux软件设计7.1.2Bootloader之vivivivi是由韩国MIZI公司提供的一款针对S3C2410芯片的BootLoader。vivi的启动过程分为两个阶段:阶段1和阶段2。阶段1的主要工作是:硬件初始化;配置串口;复制自身到SDRAM中(跳转到C代码的入口函数)。阶段2的主要工作是:对硬件系统继续初始化;内存映射初始化,内存管理单元MMU初始化;初始化堆;初始化MTD设备,MTD设备指具有闪存功能的设备,如闪存芯片、闪存卡等;初始化私有数据;初始化内置命令;启动vivi。10第7章嵌入式Linux软件设计主要内容1324Bootloader引导程序Linux的移植驱动程序开发应用程序开发11第7章嵌入式Linux软件设计7.2Linux的移植所谓Linux移植,就是针对具体的目标平台对Linux做必要的改写后,安装到该目标平台并使其正确运行的过程。基本内容包括:获取某一版本的Linux内核源码。根据具体的目标平台,对源码进行必要的改写(主要是修改有关体系结构的部分),然后添加一些驱动,打造一款适合目标平台的新的操作系统。对该系统进行针对目标平台的交叉编译,生成一个内核映像文件。将该映像文件烧写、安装到目标平台中。12第7章嵌入式Linux软件设计7.2.1Linux内核的目录结构1./arch:其中的子目录包含了所有与硬件体系结构相关的内核移植代码。每一个目录都代表一种硬件平台,对于每种平台都应该包括:boot:包含启动内核所使用的部分或全部平台的相关代码。kernel:包含支持体系结构特有的特征代码。lib:包含存放体系结构特有的通用函数的实现代码。mm:包含存放体系结构特有的内存管理程序的实现。mach-xxx:包含存放该处理器的移植代码。2./Documentation:其中的子目录包含有关内核的许多非常详细的文档。3./drivers:其中的子目录包含内核中所有的设备驱动程序。4./fs:其中的子目录包含了所有文件系统的代码。5./include:其中的子目录包含了建立内核代码时所需的大部分库文件的头文件,该模块利用其他模块重建内核。同时,包括不同平台需要的库文件。6./init:其中的子目录包含了内核的初始化代码,内核从此目录下开始工作。7./ipc:其中的子目录包含了内核的进程间通讯的代码。8./kernel:其中的子目录包含了主内核的代码,如进程调度等。9./lib:其中的子目录包含了通用的库函数代码等。10./mm:其中的子目录包含了内核的内存管理代码。11./net:其中的子目录包含了内核的网络相关代码。12./scripts:其中的子目录包含了配置内核的一些脚本文件。13第7章嵌入式Linux软件设计7.2.2Linux内核源码通常对内核源码的改写难度较大,因为这不仅要求对内核结构非常熟悉,而且也要对目标平台的硬件结构相当了解。所以这部分工作主要由目标平台厂商提供,如对于ARM平台,对Linux内核源码的改写就是由英国ARM公司完成的。对于读者来说,只需从其网站上下载相关版本的Linux内核补丁,再安装补丁即可。14第7章嵌入式Linux软件设计7.2.3交叉编译环境的建立交叉编译指利用运行在机器上的编译器编译某个源程序,生成在另一台机器上运行的目标代码的过程。对于Linux系统和ARM平台来讲,GCC交叉编译器能高效的完成移植,下面介绍生成GCC交叉编译器的一般过程。(1)下载源代码(2)编译binutils(3)配置Linux内核头文件(4)第一次编译gcc(5)交叉编译glibc(6)第二次编译gcc15第7章嵌入式Linux软件设计7.2.4修改Linux内核文件1.设置目标平台和指定交叉编译器2.修改arch/arm目录下Makefile文件3.修改arch/arm目录下config.in文件4.修改arch/arm/boot目录下Makefile文件5.修改arch/arm/boot/compressed目录下Makefile文件6.在arch/arm/boot/compressed目录下添加head-s3c2410.s文件,该文件主要用来初始化处理器。7.在arch/arm/def-configs目录下添加配置好的S3C2410的配置文件。8.修改arch/arm/kernel目录下Makefile文件9.修改arch/arm/kernel目录下的debug-armv.s文件10.修改arch/arm/kernel目录下的entry-armv.s文件11.修改arch/arm/mm目录下的相关文件12.修改arch/arm/mach-s3c2410目录下的相关文件16第7章嵌入式Linux软件设计7.2.5Linux内核及文件系统的编译1.编译Linux内核makedepmakecleanmakezImage2.制作cramfs文件系统利用工具软件MKCRAMFS制作cramfs文件系统。假设root_tech目录包含将来要用到的所有文件,把制作工具和root_tech放在同一个目录下,并在该目录下使用命令:MKCRAMFSroot_techrootfs.cramfs17第7章嵌入式Linux软件设计7.2.6Linux内核及文件系统的下载1.利用vivi通过超级终端重新下载viviviviloadflashvivix2.利用vivi烧写内核和root文件系统viviloadflashkernelxviviloadflashrootx3.利用网络烧写软件imagewrite烧写内核和root文件系统./imagewrite/dev/mtd/0vivi:0./imagewrite/dev/mtd/0zImage:192k./imagewrite/dev/mtd/0root.cramfs:2m18第7章嵌入式Linux软件设计主要内容1324Bootloader引导程序Linux的移植驱动程序开发应用程序开发19第7章嵌入式Linux软件设计设备驱动程序的工作原理设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序作为内核的一部分,完成以下功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。Linux下的设备驱动程序是内核的一部分,运行在内核模式。在Linux系统中,使用file_operation结构将设备驱动程序和文件系统相关联,在这个结构里存放了设备各种操作的入口函数。20第7章嵌入式Linux软件设计Linux下设备驱动程序在输入/输出系统中的地位用户程序的进程(设备)文件系统设备驱动程序设备服务子程序中断处理程序物理设备控制器输入/输出请求输入/输出响应物理设备21第7章嵌入式Linux软件设计驱动程序的开发和使用步骤1.用户在自己的驱动程序源文件中定义file_operations结构,并编写出设备需要的各个操作函数,对于设备不需要的操作函数用NULL初始化;2.定义一个初始化函数,该函数应包含以下几项工作:(1)对使用到的硬件寄存器进行初始化,包括中断寄存器。(2)初始化与设备相关的参数。(3)注册设备。intregister_chrdev(unsignedint,constchar*,structfile_operations*)其中三个参数分别代表主设备号、设备名和file_operations结构变量的地址。(4)注册设备使用的中断。注册中断使用的函数。(5)其他的一些初始化工作,比如给设备分配I/O,申请DMA通道等。3.将设备驱动加到Linux内核中4.将设备驱动编译成驱动模块22第7章嵌入式Linux软件设计主要内容1324Bootloader引导程序Linux的移植驱动程序开发应用程序开发23第7章嵌入式Linux软件设计应用程序的开发步骤开发Linux应用程序一般分为以下几个步骤:编写程序编写Makefile文件编译程序运行程序将生成的可执行文件加入文件系统。如果应用程序的运行需要某些驱动程序,先将驱动程序挂接到文件系统中。24第7章嵌入式Linux软件设计举例:hello应用程序的开发和运行1.编写Hello程序编写hello.c文件,保存在hello目录下。代码如下所示:#includestdio.h#includestdlib.hintmain(intargc,char**argv){printf(HelloReader,Congradulations!!!\n);return(0);}2.编写
本文标题:嵌入式开发-第7章 嵌入式Linux软件设计
链接地址:https://www.777doc.com/doc-3760659 .html