Linux启动代码编程实验课件

上传人:m**** 文档编号:568036187 上传时间:2024-07-23 格式:PPT 页数:32 大小:470.50KB
返回 下载 相关 举报
Linux启动代码编程实验课件_第1页
第1页 / 共32页
Linux启动代码编程实验课件_第2页
第2页 / 共32页
Linux启动代码编程实验课件_第3页
第3页 / 共32页
Linux启动代码编程实验课件_第4页
第4页 / 共32页
Linux启动代码编程实验课件_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Linux启动代码编程实验课件》由会员分享,可在线阅读,更多相关《Linux启动代码编程实验课件(32页珍藏版)》请在金锄头文库上搜索。

1、第第4章章Linux启动代码编程实验Linux启动代码编程实验BootLoader的基本概念的基本概念nBootLoaderBootLoader是系统加电后运行的第一段软件代码。是系统加电后运行的第一段软件代码。n嵌入式系统中,整个系统的加载启动任务完全由嵌入式系统中,整个系统的加载启动任务完全由 BootLoaderBootLoader来完成。比如来完成。比如在一个基于在一个基于ARM920T coreARM920T core的嵌入式系统中,系统在上电或复位时都从地址的嵌入式系统中,系统在上电或复位时都从地址0x000000000x00000000开始执行,而在这个地址处安排的通常就是系统的

2、开始执行,而在这个地址处安排的通常就是系统的BootLoaderBootLoader程序。程序。n简单地说,简单地说,BootLoaderBootLoader就是在操作系统内核或用户应用程序运行之前运行就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。调用操作系统内核或用户应用程序准备好正确的环境。n通

3、常,通常,BootLoaderBootLoader 是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的式系统建立一个通用的 BootLoaderBootLoader 是很困难的。是很困难的。Linux启动代码编程实验Bootloader总结总结n功能n硬件初始化硬件初始化n引导操作系统引导操作系统n下载程序(串口、网口、下载程序(串口、网口、USB)n烧写烧写flashn特征特征n程序复位运行入口点程序复位运行入口点n通常用汇编语言通常用汇编语言+C语言编写语言编写n代码量较小代码量较小Linux启动代码编程实验BootLoad

4、er 的移植和修改的移植和修改nBootLoaderBootLoader除了依赖于除了依赖于 CPU CPU 的体系结构外,的体系结构外,BootLoaderBootLoader 实际上也依赖于具体的嵌入式板级设备的配置,比如板卡实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,的硬件地址分配,RAMRAM芯片的类型,其他外设的类型等。芯片的类型,其他外设的类型等。n对于两块不同的嵌入式板而言,即使它们是基于同一种对于两块不同的嵌入式板而言,即使它们是基于同一种 CPUCPU而构建的,如果他们的硬件资源和配置不一致的话,而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在

5、一块板子上的要想让运行在一块板子上的BootLoaderBootLoader程序也能运行在另程序也能运行在另一块板子上,也还是需要作一些必要的修改一块板子上,也还是需要作一些必要的修改。 Linux启动代码编程实验BootLoader 的安装的安装n系统加电或复位后,所有的系统加电或复位后,所有的CPUCPU通常都从通常都从CPUCPU制造商预先安排制造商预先安排的地址上取指令。比如,的地址上取指令。比如,S3C2410S3C2410在复位时都从地址在复位时都从地址 0x00000000 0x00000000 取它的第一条指令。取它的第一条指令。n嵌入式系统通常都有某种类型的固态存储设备嵌入式

6、系统通常都有某种类型的固态存储设备( (比如:比如:ROMROM、EEPROMEEPROM或或FLASHFLASH等等) )被安排这个起始地址上,因此在系统加电被安排这个起始地址上,因此在系统加电后,后,CPUCPU将首先执行将首先执行BootLoaderBootLoader程序。程序。n也就是说对于基于也就是说对于基于S3C2410S3C2410的这套系统,我们的的这套系统,我们的BootLoaderBootLoader是从是从0 0地址开始存放的,而这块起始地址需要采用可引导的地址开始存放的,而这块起始地址需要采用可引导的固态存储设备如固态存储设备如FLASHFLASH。Linux启动代码

7、编程实验用来控制用来控制 BootLoader 的设备或机制的设备或机制n串口通讯是最简单也是最廉价的一种双机通讯设备,所以往串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在往在BootLoaderBootLoader中主机和目标机之间都通过串口建立连接,中主机和目标机之间都通过串口建立连接,BootLoaderBootLoader 程序在执行时通常会通过串口来进行程序在执行时通常会通过串口来进行 I/OI/O,比比如:输出打印信息到串口,从串口读取用户控制字符等。当如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者然如果认为串口通讯速度

8、不够,也可以采用网络或者USBUSB通通讯,那么相应的在讯,那么相应的在BootLoaderBootLoader中就需要编写各自的驱动。中就需要编写各自的驱动。Linux启动代码编程实验Boot Loader 的操作模式的操作模式n启动加载模式:这种模式也称为启动加载模式:这种模式也称为 自主自主 (AutonomousAutonomous)模式。也即模式。也即BootLoaderBootLoader从目标机上的某个固态存储设备上将操作系统加载到从目标机上的某个固态存储设备上将操作系统加载到RAMRAM中中运行,整个过程并没有用户的介入。这种模式是运行,整个过程并没有用户的介入。这种模式是Bo

9、otLoaderBootLoader的正常工作的正常工作模式。模式。 n下载模式:在这种模式下,目标机上的下载模式:在这种模式下,目标机上的BootLoaderBootLoader将通过串口连接或网将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被内核映像等。从主机下载的文件通常首先被BootLoaderBootLoader保存到目标机的保存到目标机的RAMRAM中,然后再被中,然后再被 BootLoaderBootLoader写到目标机上的固态存储设备中。写到目标

10、机上的固态存储设备中。BootLoaderBootLoader 的这种模式通常在系统更新时使用。工作于这种模式下的的这种模式通常在系统更新时使用。工作于这种模式下的 BootLoaderBootLoader 通常都会向它的终端用户提供一个简单的命令行接口。通常都会向它的终端用户提供一个简单的命令行接口。 Linux启动代码编程实验BootLoader与主机间文件传输的与主机间文件传输的通信设备及协议通信设备及协议n最常见的情况就是,目标机上的最常见的情况就是,目标机上的 BootLoaderBootLoader 通过串口与主通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,机之间

11、进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用当然在串口上也可以采用xmodemxmodemymodemymodemzmodemzmodem 协议以协议以及在以太网上采用及在以太网上采用TFTPTFTP协议。协议。Linux启动代码编程实验BootLoader的主要任务与典型结的主要任务与典型结构框架构框架n从操作系统的角度看,从操作系统的角度看,BootLoaderBootLoader的总目标就是正确地的总目标就是正确地调用内核来执行。调用内核来执行。 n大多数大多数BootLoaderBootLoader都分为都分为stage1stage1和和stage2stage2

12、两大部分。两大部分。n依赖于依赖于CPUCPU体系结构的代码,比如设备初始化代码等,通体系结构的代码,比如设备初始化代码等,通常都放在常都放在stage1stage1中,而且通常都用汇编语言来实现,以中,而且通常都用汇编语言来实现,以达到短小精悍的目的,也就是前面说的启动代码。达到短小精悍的目的,也就是前面说的启动代码。n而而stage2 stage2 则通常用则通常用C C语言来实现,这样可以实现复杂的语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性功能,而且代码会具有更好的可读性和可移植性。 Linux启动代码编程实验BootLoader的主要任务与典型结的主要任务

13、与典型结构框架构框架nBootLoaderBootLoader的的stage1stage1通常包括以下步骤通常包括以下步骤n为加载为加载 BootLoaderBootLoader 的的 stage2 stage2 准备准备 RAM RAM 空间空间n拷贝拷贝 BootLoaderBootLoader 的的 stage2 stage2 到到 RAM RAM 空间中空间中n设置好堆栈设置好堆栈n跳转到跳转到 stage2 stage2 的的 C C 入口点入口点nBootLoaderBootLoader的的stage2stage2通常包括以下步骤通常包括以下步骤n初始化本阶段要使用到的硬件设备初始

14、化本阶段要使用到的硬件设备n调用应用程序或启动内核调用应用程序或启动内核Linux启动代码编程实验Stage 1初始化流程图初始化流程图nstage 1stage 1的功能:的功能: RAMRAM初始化,初始化,设置各个部件的时钟和片选,设置各个部件的时钟和片选,将将BootLoaderBootLoader拷贝到拷贝到RAMRAM中,设中,设置堆栈,调用置堆栈,调用Stage 2Stage 2。n注意:在本阶段,特别是在堆注意:在本阶段,特别是在堆栈设置之前,进行函数调用栈设置之前,进行函数调用(也有些汇编子程序不需要使(也有些汇编子程序不需要使用堆栈)或者使用堆栈保存数用堆栈)或者使用堆栈保

15、存数据将产生不可预知的结果;据将产生不可预知的结果;Linux启动代码编程实验Stage 2nstage 2stage 2的功能:的功能:初始化串口,显示菜单,通过控制台获取用户输入,初始化串口,显示菜单,通过控制台获取用户输入,并执行相应的命令操作。并执行相应的命令操作。nstage 2的代码通常用的代码通常用C C语言编写,以便于实现更复杂的功能,以及取得更语言编写,以便于实现更复杂的功能,以及取得更好的代码可读性和可移植性。但是与普通好的代码可读性和可移植性。但是与普通C C语言应用程序不同的是,在编语言应用程序不同的是,在编译和链接译和链接Boot LoaderBoot Loader这

16、样的程序时,不能使用任何这样的程序时,不能使用任何glibcglibc库中支持的函库中支持的函数。因此,从哪里跳转进数。因此,从哪里跳转进main()main()函数就成为需要解决的问题。直接把函数就成为需要解决的问题。直接把mainmain()()函数的起始地址作为整个第二阶段执行映像的入口点,或许是最直接函数的起始地址作为整个第二阶段执行映像的入口点,或许是最直接的想法。的想法。 但是这样做有两个缺点:但是这样做有两个缺点:1.1.无法通过无法通过main()main()函数传递函数参数;函数传递函数参数;2.2.无法处理无法处理main()main()函数返回的情况。函数返回的情况。n一

17、种较为巧妙的方法是利用一种较为巧妙的方法是利用trampoline(trampoline(弹簧床弹簧床) )的概念,即用汇编语言的概念,即用汇编语言编写一段编写一段trampolinetrampoline小程序,并将这段小程序作为第二阶段可执行映像小程序,并将这段小程序作为第二阶段可执行映像的执行入口点。可以在的执行入口点。可以在trampolinetrampoline汇编小程序中用汇编小程序中用CPUCPU跳转指令跳人到跳转指令跳人到mainmain()()函数中去执行;而当函数中去执行;而当main()main()函数返回时,函数返回时,CPUCPU执行路径显然会再次回到执行路径显然会再次

18、回到trampolinetrampoline程序。简而言之,这种方法的思想就是用这段程序。简而言之,这种方法的思想就是用这段trampolinetrampoline小小程序作为程序作为main()main()函数的外部包裹函数的外部包裹(External Wrapper)(External Wrapper)。Linux启动代码编程实验VIVIVIVIVIVI是韩国是韩国MiziMizi公司开发的一种公司开发的一种Boot LoaderBoot Loader,适合于,适合于ARM9ARM9处理器,支持处理器,支持S3C2410XS3C2410X。本实验系统采用的。本实验系统采用的Boot Loa

19、derBoot Loader就就是是VIVI VIVI 同所有的同所有的Boot LoaderBoot Loader一样,一样,VIVIVIVI也有两种工作模式,也有两种工作模式,即启动加载模式和下载模式。在正常运行时,都工即启动加载模式和下载模式。在正常运行时,都工作在启动加载模式。作在启动加载模式。VIVIVIVI提供了提供了MTD(Memory Technolog Device) MTD(Memory Technolog Device) 通过修通过修改代码就可以从不同的存储器启动。改代码就可以从不同的存储器启动。Linux启动代码编程实验VIVI编译及使用实验编译及使用实验【实验目的】实

20、验目的】 了解以了解以VIVI为为Boot Load的的Linux系统。系统。 通过实验掌握通过实验掌握VIVI工作原理及移植过程。工作原理及移植过程。 通过实验掌握通过实验掌握VIVI的配置、编译、构造和使用。的配置、编译、构造和使用。【实验设备】【实验设备】 硬件:硬件:EDUKIT-III实验平台,实验平台,S3C2410核心子板,核心子板,Embest JTAG仿真器套件,仿真器套件, PC机。机。 软件:软件:Windows XP操作系统,操作系统,Cygwin Unix模拟平台。模拟平台。【实验内容】【实验内容】 配置及编译配置及编译VIVI。 烧写烧写VIVI映像到映像到Flas

21、h中作为中作为Linux系统的系统的Boot Loader,并运行。并运行。【实验原理】【实验原理】 Linux启动代码编程实验1Boot Loader的作用Boot Loader是嵌入式系统中,处理器加电复位后是嵌入式系统中,处理器加电复位后首先执行的一段代码。首先执行的一段代码。Boot Loader与硬件密切相与硬件密切相关,其代码主要由汇编语言和关,其代码主要由汇编语言和C语言编写。对于不语言编写。对于不同的系统,同的系统,Boot Loader的功能有所不同,但主要的功能有所不同,但主要作用是基本相同的,有以下几点:作用是基本相同的,有以下几点:1.初始化初始化CPU运行的时钟频率;

22、运行的时钟频率;2.初始化初始化Flash和内存的数据宽度、读写访问周期和刷和内存的数据宽度、读写访问周期和刷新周期;新周期;3.初始化中断系统;初始化中断系统;4.初始化系统中各种片内、片外设备和初始化系统中各种片内、片外设备和IO端口;端口;5.初始化系统各种运行模式下的寄存器和堆栈;初始化系统各种运行模式下的寄存器和堆栈;6.加载和引导操作系统加载和引导操作系统Linux启动代码编程实验2VIVI的启动方式VIVI可以从可以从Nand Flash中启动,也可以从中启动,也可以从Nor Flash中启动。中启动。选择从不同类型的选择从不同类型的Flash上启动,其使用方法会有一些差别上启动

23、,其使用方法会有一些差别:如果如果VIVI是烧写到是烧写到Nand Flash中的,那么中的,那么VIVI将从将从Nand Flash启动。由于启动。由于NandFlash没有专门的地址线,所以它在没有专门的地址线,所以它在系统中根本就没有地址空间系统中根本就没有地址空间(其结构是共用地址和数据总线,其结构是共用地址和数据总线,分时发送地址和数据分时发送地址和数据),因此只适合用来存放数据,而不能,因此只适合用来存放数据,而不能够直接在其上执行程序指令。够直接在其上执行程序指令。S3C2410专门内置了一个专门内置了一个Nand Flash控制器,通过在芯片内设置名叫控制器,通过在芯片内设置名

24、叫Step Stone的的4 KB RAM来完成来完成Nand Flash的启动功能。因此,通过的启动功能。因此,通过Nand Flash启动的启动代码不能超过启动的启动代码不能超过4KB。如果如果VIVI是烧写到是烧写到Nor Flash中的,那么中的,那么VIVI将从将从Nor Flash启动。因为启动。因为Nor Flash具有具有XIP特性特性(能够直接在其上执行程能够直接在其上执行程序指令序指令),所以,所以VIVI将一直在将一直在Nor Flash上运行,直到进入上运行,直到进入main()函数中的函数中的mem_map_init()函数函数Linux启动代码编程实验3.VIVI操

25、作命令操作命令Load part,param,boot,flash,bon,help4.配置和编译配置和编译VIVI5.烧写烧写VIVI映像映像Linux启动代码编程实验VIVI编译及使用实验编译及使用实验【实验步骤】【实验步骤】复制复制EDUKIT-III 2410的的VIVI补丁文件补丁文件ViVi-20030929.tar.bz2.edukit2410.patch到到$SOURCEDIR/patch目目录下。录下。运行运行Cygwin VIVI源代码直接使用源代码直接使用4.1节中介绍的代码,并按以下命令打入补节中介绍的代码,并按以下命令打入补丁丁(P140)编译编译VIVI (在在Cy

26、gwin窗口中输入如下命令窗口中输入如下命令:书书P140)把编译好的把编译好的VIVI烧到实验箱烧到实验箱Nor Flash(0x00x20000)中中实验箱加电运行实验箱加电运行VIVI (运行运行VIVI后可在后可在超级终端上看到类似书上看到类似书P141P141的的输出结果输出结果) )复位重新复位重新运行运行VIVI,按按非Return键键,进入进入ViVi提示符后提示符后,执行执行help命令命令Linux启动代码编程实验【实验 过程】运行运行CygwinLinux启动代码编程实验【实验 过程】清除老文件清除老文件,运行配置命令运行配置命令Linux启动代码编程实验【实验 过程】加

27、载配置文件加载配置文件Linux启动代码编程实验【实验 过程】输入已存在的配置文件名输入已存在的配置文件名配置文件名配置文件名Linux启动代码编程实验【实验 过程】保存保存,退出退出Linux启动代码编程实验【实验 过程】运行配置命令后的结果运行配置命令后的结果Linux启动代码编程实验【实验【实验 过程】过程】编译编译,链接链接VIVI,生成生成boot image文件文件Linux启动代码编程实验【实验 过程】VIVI boot image文件所在目录文件所在目录Linux启动代码编程实验【实验 过程】连接并口线到仿真器连接并口线到仿真器,启动烧录程序启动烧录程序,调配置文件调配置文件L

28、inux启动代码编程实验【实验实验 过程过程】进行设置进行设置Linux启动代码编程实验【实验 过程】开始烧录开始烧录Linux启动代码编程实验【实验 过程】连接好串口线连接好串口线,在在PC机上启动超级终端程序机上启动超级终端程序,实验箱加电运行实验箱加电运行VIVILinux启动代码编程实验【实验 过程】复位后复位后,重新运行重新运行VIVI,按非按非Return键键,进入进入ViVi提示符后提示符后, 执行执行help命令命令Linux启动代码编程实验实训题实训题1.安装ViVi源码,并安装好补丁程序(参见书P106.若已安装好,跳过!注意:补丁程序只能安装一次,多次安装可能编译出错).2.编译,链接VIVI,生成boot image文件.连接并口线到仿真器,启动烧录程序,烧录VIVI image文件到Nor Flash中3.按老师所讲实验过程和步骤,运行VIVI,观察实验结果.4.按实验报告格式要求,写出实验报告.实验报告重点写实验中出现的问题和解决的方法,少量的截图.实验报告统一交学习委员Linux启动代码编程实验

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号