资源预览内容
第1页 / 共113页
第2页 / 共113页
第3页 / 共113页
第4页 / 共113页
第5页 / 共113页
第6页 / 共113页
第7页 / 共113页
第8页 / 共113页
第9页 / 共113页
第10页 / 共113页
亲,该文档总共113页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
大连东软信息学院 嵌入式系统导论课程组,嵌入式系统导论,2020/7/31,第3章 嵌入式开发环境的搭建,2020/7/31,3.1嵌入式开发环境概述,1.建立开发环境 2.配置开发主机,配置MINICOM 3.建立引导装载程序bootloader 4.下载别人已经移植好的linux操作系统 5.建立根文件系统 6.建立应用程序的falsh分区 7.开发应用程序 8.烧写内核、根文件系统、应用程序 9.发布产品,2020/7/31,第3章 嵌入式开发环境的搭建,2020/7/31,3.2 Flash程序烧写,烧写:即利用特殊工具向开发板中下载代码。 实例:向ARM板(裸机)上烧写BootLoader、内核、根文件系统 前提:存在目录。./img,其下有已经准备好的各个部分软件的映像文件(即用交叉编译器编译好的可执行文件),分别为: VIVI:针对S3C2410的BootLoader映像文件 zImage:经裁剪的Linux内核映像文件 root.cramfs:根文件系统映像文件 sjf2410:完成烧写的程序,2020/7/31,3.2 Flash程序烧写,具体烧写步骤 1.安装JTAG驱动程序 将整个giveoio目录(JTAG驱动所在目录)复制到c:WINDOWS下,并将该目录下的giveio.sys文件复制到系统盘驱动目录下,如c:WINDOWSsystem32drivers 在控制面板中添加该驱动程序 2.设置超级终端 按照波特率115300,数据位8,无奇偶校验,停止位1,数据流控为无进行设置 3.烧写引导程序 使用sjf2410程序对vivi进行第一次烧写 vivi启动后,使用bon part命令对flash进行分区 使用load命令对vivi进行第二次烧写 4.烧写内核 使用load命令对kernel进行烧写 5.烧写根文件系统 使用load命令对rootfs进行烧写,2020/7/31,第3章 嵌入式开发环境的搭建,2020/7/31,3.3.1 BootLoader程序原理,对于PC系统,引导加载程序BIOS(固件程序)和位于磁盘MBR(主引导记录)中系统引导程序(LILO和GRUB等)一起组成。BIOS完成硬件检测和资源分配后,将硬盘MBR中的引导程序读到系统的内存中,然后将控制权交给引导程序。引导程序的主要任务就是将内核映像从硬盘上读到内存中,然后跳转到内核的入口点去运行,即开始启动操作系统。 在嵌入式系统中,主要使用flash作为系统的存储煤介,很少用磁盘,因此整个系统的加载启动任务就完全由引导程序(也称为Bootloader)来完成。,2020/7/31,就是在操作系统内核运行之前运行的一段小程序。通 过这段小程序,可以初始化硬件设备、建立内存空间的映 射图,从而将系统的软硬件环境带到一个合适的状态,以 便为最终调用操作系统内核准备好正确的环境。,嵌入式系统中的bootloader概念,2020/7/31,Bootloader的功能,1.硬件设备初始化(CPU的主频、SDRAM、中断、串口等) 2.内核启动参数 3.启动内核 4.与主机进行交互,从串口、USB口或者网络口下载映象文件,并可以对FLASH等存储设备进行管理,2020/7/31,Bootloader特点,1.依赖于硬件:每种不同的CPU体系结构都有不同的bootloader 2.bootloader还依靠具体的嵌入式板级设备的配置,2020/7/31,Boot Loader 的安装媒介,1. 系统加电或复位后,所有的处理器通常都从某个预先安排的地址上取指令。比如,ARM在复位时从地址0 x0取指。 2. 嵌入式系统中通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,处理器将首先执行 Boot Loader 程序 3. Bootloader是最先被系统执行的程序,2020/7/31,固态存储设备的典型空间分配结构,2020/7/31,Bootloader的烧写方式,1.通过JTAG口 2.通过以太网口 3.通过串口 4.其中前两种方式比后一种快得多,2020/7/31,Boot Loader的控制方式,1. 主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行通讯,比如:输出打印信息到串口,从串口读取用户控制字符 2. 也可以通过JTAG等其他接口通讯,2020/7/31,Boot Loader 的操作模式,大多数 Boot Loader 都包含两种不同的操作模式: 1.启动加载模式 2.下载模式 从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别,2020/7/31,启动加载模式 启动加载模式,称为“自主”(Autonomous)模式 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。,Boot Loader 的操作模式,2020/7/31,下载模式 在下载模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机下载文件,如:下载内核映像和根文件系统映像等 从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。 这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。 工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。,Boot Loader 的操作模式,2020/7/31,BL的典型结构框架,大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。 依赖于处理器体系结构和板级初始化的代码,通常都放在 stage1 中,用汇编语言实现 而 stage2 则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。,2020/7/31,Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序): 硬件设备初始化。 为加载 Boot Loader 的 stage2 准备 RAM 空间。 拷贝 Boot Loader 的 stage2 到 RAM 空间中。 设置好堆栈 跳转到 stage2 的 C 入口点。,BL的典型结构框架,2020/7/31,Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序): 初始化本阶段要使用到的硬件设备。 检测系统内存映射(memory map)。 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 为内核设置启动参数。 调用内核。 stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。与普通 C 语言应用程序不同的是,在编译和链接 boot loader 这样的程序时,我们不能使用 glibc 库中的任何支持函数。,BL的典型结构框架,2020/7/31,3.3.2 几种流行的Linux BootLoader,1.U-Boot 2.BLOB 3.RedBoot 4.VIVI,2020/7/31,3.3.3 S3C2410平台上的VIVI分析,vivi是由韩国Mizi公司开发的一种Boot Loader,适合于ARM9处理器,支持S3C2410UP-NETARM2410平台的引导程序 启动模式和下载模式 结构简单 支持Linux内核引导,可以传递内核参数 支持分区(bon) 命令行,2020/7/31,vivi的Stage1(文件head.S),关WATCH DOG:上电后,WATCH DOG默认是开着的 禁止所有中断 初始化系统时钟 初始化内存控制寄存器(一共13个) 检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理 点亮所有LED 初始化UART0 将vivi所有代码(包括阶段1和阶段2)从nand flash复制到SDRAM中 跳到bootloader的阶段2运行,2020/7/31,vivi的Stage1(文件head.S),2020/7/31,vivi的Stage2(文件main.c),1.打印vivi的信息,包括版本号等 2.调用若干个初始化函数 3.boot_or_vivi():判断是否有“r”,回车或空格键按下,若有,则进入vivi shell;若没有,则执行boot命令,启动内核 4.boot命令执行后,找到kernel分区,找它的偏移量和大小,执行boot_kernel()函数,拷贝内核映象 5.设置linux启动参数,打印Now Booting Linux 6.调用call_linux()函数,启动内核,2020/7/31,第3章 嵌入式开发环境的搭建,2020/7/31,3.4.1内核的裁减,ARM上的 linux内核移植准备工作 1.下载linux2.6.0内核及其关于ARM平台的补丁,如:Patch2.6.0-rmkl.gz 2.给linux2.6.0打补丁 3.准备交叉编译环境 4.修改内核目录下的makefile文件,2020/7/31,Linux 内核的编译菜单有好几个版本: 1)make config:进入命令行,可以一行一行的配置。 2)make menuconfig:开发人员比较熟悉的menuconfig 菜单。 3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。,3.4.1内核的裁减,2020/7/31,2.4.X 版本xconfig 配置菜单:,2020/7/31,2.4.X 版本menuconfig 配置菜单 :,2020/7/31,2.6.X 版本 xconfig配置菜单 :,2020/7/31,内核模块处理方式,要增加对某部分功能的支持,可以把相应部分编译到内核中,也可以把该部分编译成模块,动态调用。 如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,经常使用的部分直接编译到内核中,比如网卡。 如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。,2020/7/31,在选择相应的配置时,有三种选择方式: Y 将该功能编译进内核 N 不将该功能编译进内核 M 将该功能编译成可以在需要时动态插入到内核中的模块,2020/7/31,2020/7/31,Linux 内核的编译菜单有好几个版本: 1)make config:进入命令行,可以一行一行的配置。 2)make menuconfig:开发人员比较熟悉的menuconfig 菜单。 3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。,3.4.2内核的编译,2020/7/31,(1)make clean:清楚当前环境 (2)make dep:设置变量依赖关系 (3)make zImage:编译内核,生成zImage,编译命令,2020/7/31,编译完成的Linux内核在哪里?,./vmlinux,elf格式未压缩内核 arch/arm/boot/compressed/vmlinux,压缩以后的elf格式内核,此文件是从非压缩的内核映像产生的。 arch/arm/boot/zImage,可自解压的压缩内核的映像文件,202
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号