精品文档
完善的中文支持,强大的技术支持,完整的文档。
18、 什么是Boot Loader,ARM系统中Boot Loader的主要作用是什么
Boot Loader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们能初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
作用:硬件初始化,操作系统引导。 19、 简述Boot Loader的启动过程
大多数 BootLoader 都包含两种不同的操作模式:启动加载模式和下载模式。启动加载模式也称为自主模式,即 BootLoader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。而下载模式则是目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。这种模式通常在第一次安装内核与根文件系统时被使用,或系统更新时使用。一般嵌入式系统的Boot Loader较为常用的是启动加载模式,它的加载流程也是我们要重点讨论的内容。
(1)启动部分
启动部分主要是实现初始化硬件的功能。在参考板的BootLoader目录下,会发现一些.s文件,可能会是init.s或者是reset.s等,这样的文件是CPU加电后最先执行的代码。接着Oal.exe通过Startup函数完成硬件的初始化,StartUp 函数是Boot Loader的入口函数。该函数一般是使用汇编语言编写,与CPU关系非常紧密,能完成初始化CPU、内存等核心硬件。
Startup.s代码与硬件平台的Bootloader启动代码共用。如果是热启动,即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。在系统硬件初始化完毕之后,Startup调用OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核,然后调用KernelStart函数跳转到内核。因此,这部分工作是BootLoader的一大重点。
(2)主控部分
StartUp 函数初始化CPU等核心硬件并跳转到Main函数后,系统就会转入C语言代码执行环境。这时函数分为3个模块:BLCOMMON、Download 、FLASH 。其中BLCOMMON模块是由微软提供的,执行一些逻辑上的功能,因此建议开发人员不要对其进行修改。而Download 、FLASH 中的函数与硬件平台息息相关,因此对于每种硬件平台都要将函数的实现进行修改。
其中,BLCOMMON库是与BootLoader程序链接在一起的,BLCOMMON库的入口点为BootloaderMain函数,它是Startup汇编函数完成后跳转至该入口的。Main函数的主要任务时调用BLCommon中的 BootloaderMain()函数,这是BootLoader的主控函数,它控制了BootLoader的完整执行流程。这部分代码由C语言实现,是BLCOMMON代码的一部分,它可以用来执行比较复杂的操作。比如检测内存和Flash的有效性、检测外部设备接口、检测串口并且向已经连接的主机发送调试信息、通过串口等待命令、启动网络接口、建立内存映射等汇编无法完成的工作。
(3)下载部分
一般在平台调试完毕后,可以在不用人工干预的情况下自动加载CE,这也是BootLoader的功能之一。而在调试阶段时,这需要通过Loader所支持的命令来进行操作的,借助于这精品文档
精品文档
些命令不仅可以完成硬件平台的部分测试,还能完成CE的BootLoader程序最为重要的一个功能--下载CE映像。如果说硬件调试功能可以由其它的程序代替而不放入BootLoader中,但是下载映像文件却是BootLoader必需的功能。
CE映像文件通常叫做nk.bin,它是Windows CE二进制数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。当然,也可以选择生成.sre格式的代码文件,但是相于对前一种格式,它的代码要长很多,所需要的下载时间也更长。
(4)支持DOC部份
对于WinCE操作系统而言,丰富的多媒体功能是其一大特点。但是随之而来的问题是,如果选择了图形界面和中文支持,系统很容易大大超出嵌入式系统上百KB的数量级。而DOC(Disk On Chip)则提供了一种相对廉价的大存储容量的解决方案。
DOC本质上是一种加以软件控制的NAND格式的Flash,通过TFFS这一软件层提供对WinCE的支持。由于DOC不能像内存一样被直接访问,所以其加载WinCE的过程有些特殊,必须要在BootLoader中加入专门的代码,才能使用DOC来存放WinCE映像文件
20、 arch
Linux内核源码是如何组织的,主要的目录文件有哪些?
包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录 下,其中比较重要的包括:
kernel 内核核心部分 mm 内存管理
math-emu 浮点单元仿真 lib 硬件相关工具函数 boot 引导程序 pci PCI总线和 power CPU相关状态
block 部分块设备驱动程序
crypto 常用加密和散列算法如 AES、SHA等 还有一些压缩和CRC校验算法。
/*********************************************************************************************************************************/ drivers
放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如 ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不仅初始化硬盘,也初始化网络,因为安装nfs文件系统的时候需要网络; fs
文件系统代码,每个支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等 。 include
包括编译内核所需的大部分头文件,与平台无关的头文件放在include/linux子目录下,平台相关的头文件如include/asm-arm init
这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的好的起点之一。 kernel
主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文精品文档
精品文档
件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中。 Lib
库函数代码。 Mm
这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位arch/*/mm/,例如arch/i386/mm/Fault.c; Net
网络支持代码 sound
音频设备驱动代码 Scripts
描述文件,脚本,用于对核心的配置; documentation
关于内核各部分的通用解释和注释 ipc
进程间通信的代码。 security
主要是一个SELinux的模块。 Modules
模块文件目录,是个空目录,用于存放编译时产生的模块目标文件。
/**********************************************************************************************************************************/
在每个子目录下,都有一个 Makefile 和一个Readme 文件,仔细阅读这两个文件,对内核源码的理解很有用。 其中顶层目录下的 Makefile 负责整个内核的编译,编译的时候递归的调用各个目录下的 Makefile 文件,最终将产生内核的可执行映像文件。
Makefile:分布在Linux内核源码中的Makefile定义了Linux内核编译的规则。Makefile 决定编译哪些文件、 怎样编译这些文件 、按什么顺序连接这些文件。
config:在配置内核时生成的一个文件,根据.config来决定使用哪些Makefile。 21、 内核移植的一般步骤 第一阶段: 1、获取源码 2、在系统中添加对平台(ARM)的支持: 3、改平台输入: 解压 toplevel Makefile 改交叉编译器路径 arch/arm/mach-s3c2440/mach-smdk2440.c 4、改机器码,与U-Boot配合才能启动: arch/arm/tools/mach-types 5、改镜像的存放地: 6、做自己的配置单: arch/arm/boot-->Makefile #make menuconfig 默认镜像存在arch/arm/boot 加载2410的配置单 修改System type 修改版本信息: 精品文档
general setup 精品文档
使支持交叉编译器 kernel features 7、保存.config 并复制一个配置单的备份 8、编译镜像: #make distclean #make zImage 9、启动内核看console信息 第二阶段: 1、移植NandFlash驱动: (驱动内核已做好,只修改几个地方) arch/arm/plat-s3c24xx/common-smdk.c 改分区信息 改读写匹配时间 Drivers/mtd/nand/s3c2410.c 去掉ECC校验(内核与U-Boot校验不同) #make menuconfig 添加NandFlash支持 2、完善串口驱动(内核只支持两个串口,可把红外接口修改为串口)(可选操作) 红外改串口: arch/arm/mach-smdk2440.c drivers/serial/s3c2410.c和samsung.c 配置菜单 3、移植文件系统 1、获得 yaffs文件系统源码和yaffs文件系统补丁 解压 2、内核中添加yaffs支持 打补丁 改配置单Device Drivers、File system 3、编译BusyBox: 目的是生成文件系统所需要的一些目录和文件 3.1、解压BusyBox源码 进入源码目录添加编译器路径 改Makefile 3.2、改BusyBox配#make menuconfig 置单 3.3、编译安装BusyBox 4、构建文件系统: #make; make install 保存配置单 生成文件系统部分源码在_install 目的是构建一个比较完整的文件系统 4.1、构建框主目录: 子目录: 架 复制:BusyBox生成的_install目录下的目录 root_2.6.30.4 新建:#mkdir dev etc home lib mnt opt proc root sddisk sys tmp udisk var web usr/lib usr/share 精品文档
dev设备目录/etc配置文件目录/home用户目录/lib库目录
相关推荐: