嵌入式系统嵌入式.ppt
2BIOS启动除了启动程序,BIOS还提供了一组中断以便于对硬件设备的访问。我们知道,当键盘上的某一键被按下,CPU就会产生一个中断并把这个键的信息读入。在操作系统没有被装入以前(Bootsect.S还没有被读入),中断的响应程序由BIOS提供。第23页,讲稿共62页,2023年5月2日,星期三3BootLoaderBootLoader是一段汇编代码,存放在MBR中,它的主要作用就是将系统启动代码读入内存。第24页,讲稿共62页,2023年5月2日,星期三3BootLoader因为在启动过程中,BIOS会把BootLoader读入内存,并把控制权交给它。MBR(硬盘启动)内的代码就是BootLoader或者它的一部分,为了说明Bootloader的实现,先解释磁盘结构。第25页,讲稿共62页,2023年5月2日,星期三3BootLoader一个硬盘在DOS文件系统下可被分为四个基本分区,可以把一个基本分区定义为一个扩展分区,然后再把这个基本分区分为一个或多个逻辑分区。整个硬盘的分区表存放在硬盘的第一个扇区(MBR),每个扩展分区也对应一个分区表,它存放在该扩展分区对应的第一个扇区里。除主引导扇区外,每个基本分区和扩展分区也有自己的引导扇区,结构与MBR相同,但逻辑分区的引导扇区不能用于启动。第26页,讲稿共62页,2023年5月2日,星期三3BootLoader如果是硬盘启动,BootLoader将查找主分区表中标记为活动分区的表项,把该表项对应的分区的引导扇区读入,然后将控制权交给该扇区内的引导程序。第27页,讲稿共62页,2023年5月2日,星期三3BootLoader 如果计算机上装有不只一个操作系统,仅仅MS-DOS的BootLoader无法完成这种工作,需要一个可以多重起动的工具,下面介绍Linux下最常用的LILO.第28页,讲稿共62页,2023年5月2日,星期三3BootLoaderLILO实际上是一个在Linux环境下编写的BootLoader程序,主要功能是引导Linux操作系统的启动。LILO的功能实际上是有几个程序共同实现的,它们是:(1)MapInstaller这是LILO用于管理启动文件的程序。它将bootloader写入引导分区,创建纪录文件以映射内核的启动。(2)Thebootloader它负责把Linux内核或其他操作系统的引导分区读入内存。还提供命令行接口,让用户选择从哪个操作系统启动和加入启动参数。(3)其他文件:主要包括用于存放MapInstaller记录的map文件和存放LILO配置信息的配置文件。第29页,讲稿共62页,2023年5月2日,星期三4进入操作系统BootLoader做了这么多工作,一言以蔽之,只是把操作系统的代码调入内存,所以当它执行完后,自然该把控制权交给操作系统,由操作系统的启动程序来完成剩下的工作。第30页,讲稿共62页,2023年5月2日,星期三4进入操作系统把控制权交给Setup.S这段程序进入保护模式,同时把控制权交给Head.SHead.S调用/init/main.C中的start_kernel函数,启动程序从start_kernel()函数继续执行第31页,讲稿共62页,2023年5月2日,星期三4进入操作系统
(1)Setup.S首先,Setup.S对已经调入内存的操作系统代码进行检查,如果没错,它会通过BIOS中断获取内存容量,硬盘等信息(实模式)准备让CPU进入保护模式a.先屏蔽中断信号b.调用指令lidt和lgdtc.对8259中断控制器进行编程d.协处理器重新定位完成这几件事后,Setup.S设置保护模式的标志,重取指令,再用一条跳转指令jmpi0x100000,KERNEL_CS。进入保护模式下的启动阶段,控制权交给Head.S.第32页,讲稿共62页,2023年5月2日,星期三4进入操作系统
(2)Head.S也要先做屏蔽中断一类的工作然后对中断向量表做一定的处理BootLoader读入内存的启动参数和命令行参数,Head.S把它们保存在empty_zero_page页中检查CPU类型对协处理器进行检查页初始化,调用setup_paging这个子函数因为已进入保护模式,段机制的多任务属性体现第33页,讲稿共62页,2023年5月2日,星期三4进入操作系统
(3)main.c中的初始化Head.S调用/init/main.c中的start_kernel函数,把控制权交给它,这个函数是整个操