




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 7 章 嵌入式Linux软件设计,主要内容,1,3,2,4,Bootloader引导程序,Linux的移植,驱动程序开发,应用程序开发,7.1.1 Bootloader的启动过程,BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader都分为stage1和stage2两大部分。,BootLoader的stage1通常包括以下步骤: 硬件设备初始化。 为加载BootLoader的stage2准备RAM空间。 复制BootLoader的stage2到RAM空间中。 设置好堆栈。 跳转到stage2的入口点。 BootLoader的stage2通常包括以下步骤: 初始化本
2、阶段要使用的硬件设备。 检测系统内存映射。 将kernel映像和根文件系统映像从Flash读到RAM中。 为内核设置启动参数。 调用内核。,Bootloader的两种不同操作模式,启动加载模式:这种模式也称为自主模式(Autonomous)模式,即Bootloader从目标机上的某个固态存储设备上将操作系统加载到ARM中运行,整个过程没有用户的介入。这种模式是Bootloader的正常工作状态。在嵌入式产品发布时,bootloader必须工作在这种模式下。 下载模式:目标机上的Bootloader通过串口连接或网络连接等通信手段从主机上下载文件,比如下载应用程序、数据文件、内核映像等。从主机上
3、下载的文件通常首先被bootloader保存在目标机的RAM中,然后在被Bootloader写到目标机上的固态存储设备中。这种模式主要用在系统更新时。,常见的bootloader,U-boot U-boot是德国DENX小组开发的用于多种嵌入式CPU的Bootloader程序,它可以运行在基于PowerPC、ARM、MIPS等多种嵌入式开发板上。 http:/u- ftp:/ftp.denx.de/pub/u-boot/,常见的bootloader(continued),Blob Blob是Boot loader Object的缩写,是一款功能强大的Bootloader。最初由Jan-Derk
4、 Bakker和Erik Mouw写的,现移植到很多基于ARM的CPU上。 ,常见的bootloader(continued),ARMboot 是一个以ARM或Strong ARM为内核CPU的嵌入式系统的Bootloader,该软件的目标是使新的平台更容易被移植并尽可能地发挥其强大的性能。 ,常见的bootloader(continued),RedBoot 最初有Redhat开发,集bootloader、调试、flash烧写于一体,支持串口、网络下载,执行可执行应用程序。 /redboot/,7.1.2 Bootloader之vivi,vivi是由韩国
5、MIZI公司提供的一款针对S3C2410芯片的BootLoader。,vivi的启动过程分为两个阶段:阶段1和阶段2。 阶段1的主要工作是: 硬件初始化; 配置串口; 复制自身到SDRAM中(跳转到C代码的入口函数)。 阶段2的主要工作是: 对硬件系统继续初始化; 内存映射初始化,内存管理单元MMU初始化; 初始化堆; 初始化MTD设备,MTD设备指具有闪存功能的设备,如闪存芯片、闪存卡等; 初始化私有数据; 初始化内置命令; 启动vivi。,主要内容,1,3,2,4,Bootloader引导程序,Linux的移植,驱动程序开发,应用程序开发,7.2 Linux的移植,所谓Linux移植,就是
6、针对具体的目标平台对Linux做必要的改写后,安装到该目标平台并使其正确运行的过程。基本内容包括: 获取某一版本的Linux内核源码。 根据具体的目标平台,对源码进行必要的改写(主要是修改有关体系结构的部分),然后添加一些驱动,打造一款适合目标平台的新的操作系统。 对该系统进行针对目标平台的交叉编译,生成一个内核映像文件。 将该映像文件烧写、安装到目标平台中。,7.2.1 Linux内核的目录结构,1/arch:其中的子目录包含了所有与硬件体系结构相关的内核移植代码。每一个目录都代表一种硬件平台,对于每种平台都应该包括: boot:包含启动内核所使用的部分或全部平台的相关代码。 kernel:
7、包含支持体系结构特有的特征代码。 lib:包含存放体系结构特有的通用函数的实现代码。 mm: 包含存放体系结构特有的内存管理程序的实现。 mach-xxx:包含存放该处理器的移植代码。 2/Documentation:其中的子目录包含有关内核的许多非常详细的文档。 3/drivers:其中的子目录包含内核中所有的设备驱动程序。 4/fs:其中的子目录包含了所有文件系统的代码。 5/include:其中的子目录包含了建立内核代码时所需的大部分库文件的头文件,该模块利用其他模块重建内核。同时,包括不同平台需要的库文件。 6/init:其中的子目录包含了内核的初始化代码,内核从此目录下开始工作。 7
8、/ipc:其中的子目录包含了内核的进程间通讯的代码。 8/kernel:其中的子目录包含了主内核的代码,如进程调度等。 9/lib:其中的子目录包含了通用的库函数代码等。 10/mm:其中的子目录包含了内核的内存管理代码。 11/net:其中的子目录包含了内核的网络相关代码。 12/scripts:其中的子目录包含了配置内核的一些脚本文件。,7.2.2 Linux内核源码,通常对内核源码的改写难度较大,因为这不仅要求对内核结构非常熟悉,而且也要对目标平台的硬件结构相当了解。所以这部分工作主要由目标平台厂商提供,如对于ARM平台,对Linux内核源码的改写就是由英国ARM公司完成的。对于读者来说
9、,只需从其网站上下载相关版本的Linux内核补丁,再安装补丁即可。,7.2.3 交叉编译环境的建立,交叉编译指利用运行在机器上的编译器编译某个源程序,生成在另一台机器上运行的目标代码的过程。 对于Linux系统和ARM平台来讲,GCC交叉编译器能高效的完成移植,下面介绍生成GCC交叉编译器的一般过程。 (1)下载源代码 (2)编译binutils (3)配置Linux内核头文件 (4)第一次编译gcc (5)交叉编译glibc (6)第二次编译gcc,7.2.4 修改Linux内核文件,1设置目标平台和指定交叉编译器 2修改arch/arm目录下Makefile文件 3修改arch/arm目录
10、下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文件 1
11、1修改arch/arm/mm目录下的相关文件 12修改arch/arm/mach-s3c2410目录下的相关文件,7.2.5 Linux内核及文件系统的编译,1编译Linux内核 make dep make clean make zImage 2制作cramfs文件系统 利用工具软件MKCRAMFS制作cramfs文件系统。 假设root_tech目录包含将来要用到的所有文件,把制作工具和root_tech放在同一个目录下,并在该目录下使用命令: MKCRAMFS root_tech rootfs.cramfs,7.2.6 Linux内核及文件系统的下载,1利用vivi通过超级终端重新下载vi
12、vi vivi load flash vivi x 2利用vivi烧写内核和root文件系统 vivi load flash kernel x vivi load flash root x 3利用网络烧写软件imagewrite烧写内核和root文件系统 ./imagewrite /dev/mtd/0 vivi:0 ./imagewrite /dev/mtd/0 zImage:192k ./imagewrite /dev/mtd/0 root.cramfs:2m,主要内容,1,3,2,4,Bootloader引导程序,Linux的移植,驱动程序开发,应用程序开发,设备驱动程序的工作原理,设备驱
13、动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节, 应用程序可以像操作普通文件一样对硬件设备进行操作。,设备驱动程序作为内核的一部分,完成以下功能: 对设备初始化和释放; 把数据从内核传送到硬件和从硬件读取数据; 读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 检测和处理设备出现的错误。,Linux下的设备驱动程序是内核的一部分,运行在内核模式。在Linux系统中,使用file_operation结构将设备驱动程序和文件系统相关联,在这个结构里存放了设备各种操作的入口函数。,Linux下设备驱动程序在输入/输出系统中的地位,驱动程序的开发和使用步骤,
14、1用户在自己的驱动程序源文件中定义file_operations结构,并编写出设备需要的各个操作函数,对于设备不需要的操作函数用NULL初始化; 2定义一个初始化函数,该函数应包含以下几项工作: (1)对使用到的硬件寄存器进行初始化,包括中断寄存器。 (2)初始化与设备相关的参数。 (3)注册设备。 int register_chrdev(unsigned int,const char*,struct file_operations*) 其中三个参数分别代表主设备号、设备名和file_operations结构变量的地址。 (4)注册设备使用的中断。注册中断使用的函数。 (5)其他的一些初始化工
15、作,比如给设备分配I/O,申请DMA通道等。 3将设备驱动加到Linux内核中 4将设备驱动编译成驱动模块,主要内容,1,3,2,4,Bootloader引导程序,Linux的移植,驱动程序开发,应用程序开发,应用程序的开发步骤,开发Linux应用程序一般分为以下几个步骤: 编写程序 编写Makefile文件 编译程序 运行程序 将生成的可执行文件加入文件系统。 如果应用程序的运行需要某些驱动程序,先将驱动程序挂接到文件系统中。,举例:hello应用程序的开发和运行,1. 编写Hello程序 编写hello.c文件,保存在hello目录下。代码如下所示: #include #include int main(int argc, char *argv) printf(Hello Reader,Congradulations!n); return(0); 2. 编写Makefile文件,内容如下: CC = /opt/host/armv4l/bin/armv4l-unknown-linux-gcc CFLAGS = -I/lin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文明礼仪知识竞赛题库及答案
- 2025年会计从业资格考试模拟试题及答案
- 2025年度全国安全生产月活动《安全知识》备考模拟题及答案
- 家用视听设备批发商智能客服的售后支持流程优化考核试卷
- 光缆在矿业安全监测中的可视化数据展示技术考核试卷
- 刀具材料选择与性能优化考核试卷
- 纺织品市场消费者行为模式研究考核试卷
- 化纤浆粕在船舶涂料中的耐化学侵蚀研究考核试卷
- 静电防护措施实施步骤考核试卷
- 创业投资与创业企业风险管理研究考核试卷
- 2025二手房交易合同全文版
- 2025年无偿献血知识竞赛考试题库(含答案)
- 小学老师教学课件交互
- 医院装修可行性报告
- 中国灯具市场调研及发展策略研究报告2025-2028版
- 【课件】正数和负数+ 课件人教版七年级数学上册
- 感染性心内膜炎血培养
- 产业学院教学管理制度
- 2024年度智能电网控制系统采购与安装合同
- 雅佳AKAI-EWI5000-中文音色表
- 电网安全风险管控教材课件
评论
0/150
提交评论