BIOS和Bootloader部分 Linux系统引导过程( 二 )


16位程序的操作环境?
KEMIN:其实和BIOS一样,都是16位程序(所有DOS程序不管没有界面都是16位程序) 。与32位程序运行需要一个操作环境类似,16位程序需不要操作环境?
Bootarethaton the bootof a . A bootisby BIOS afterhastothe , , and I/Oto load the .
从上面这段话可知应该是需要的,那么在开机的一刻这样的操作环境建立起来没有?请想想上BIOS的初始化工作一步,并看以下的实模式下的内存布局,非ROM内存类型(比如实模式中断向量表)的数据都是16位程序的操作环境数据 。
of the PC
线性地址范围
实模式地址范围内存类型用途

BIOS和Bootloader部分  Linux系统引导过程

文章插图
0- 3FF
0000:0000-0000:03FF
RAM
real-modetable (IVT)
400- 4FF
0040:0000-0040:00FF
BIOS data area (BDA)
500- 9FBFF
0050:0000-9000:FBFF
free(below 1 meg)
9FC00- 9FFFF
9000:FC00-9000:FFFF
BIOS data area (EBDA)
A0000- BFFFF
A000:0000-B000:FFFF
video RAM
VGA
C0000- C7FFF
C000:0000-C000:7FFF
ROM
video BIOS (32K issize)
C8000- EFFFF
C800:0000-E000:FFFF
BIOS和Bootloader部分  Linux系统引导过程

文章插图
F0000- FFFFF
F000:0000-F000:FFFF
ROM
BIOS (64K issize)
-
RAM
free(1 meg and above)
-
BIOS, PnP NVRAM, ACPI, etc.
Boot ()
接上一阶段,这一阶段一开始已经有一段引导程序代码驻留在始于 处,大小为一个扇区512字节,并且处理器下一条指令的地址是。由于引导的功能需求多种多样(例如有不同的引导介质或多操作系统共存),会有多种不同的引导程序 。引导过程细节不尽相同,比如不同的引导介质调用不同的驱动(调用软盘驱动或IDE磁盘驱动),而引导过程本身也有分两个(比如LILO)甚至三个(比如GRUB)前后相继“接力”的16 位程序完成 。不管引导的策略如何,引导程序主要任务 还是把操作系统从引导介质加载入内存 。下面是利用LILO从硬盘加Linux的一个过程(假设LILO 分两步完成引导,前一步由16位程序LA完成,后一步由16位程序LB完成):
BIOS将硬盘主引导扇区(其中有LA代码)读入至内存中的处,控制权转给该地址程序LA; LA把自身移动至处,并建立堆栈(从处向增长); LA将LB读入至内存的处,把控制权交给LB(KEMIN:LB在什么地方?目前所知它可以在LA或BIOS能访问到的任何地方); LB将把[描述符表 ]( table)读入处,并把保存[默认命令行 ](line)数据的扇区读入处; 接着LB检查用户输入,不管用户输入了一个新的内核镜像还是使用缺省内核镜像信息,[选项扇区 ]( )的数据都会被LB读入处,而最终生成的[参数行 ]( line)会保存在处(如果这个参数行中有lock选项,那新参数行会被保存作为默认的参数行); 如果用户配置了初始化镜像的话,这个镜像文件将被读入到物理内存(或16MB)末尾以下(KEMIN:也就是以内)的空间里,并且文件的起始地址必须[低于]下一[内存页 ] 的边界,以便于启动后系统把它所占的内存回收到[空闲内存池] 。
这里有一个16MB的限制,这是因为BIOS程序不支持对16MB(24位内存空间)以上内存的访问 。(KEMIN:实模式下怎么又会是24位的呢?貌似在开机与正式进入保护模式之前的代码都能够使用CPU所有指令,改变CPU的操作模式 。)(KEMIN:为什么需要初始化:?看这里。) 下一步,内核镜像的软盘启动扇区( boot )被读入处;操作系统的初始化代码扇区(setup()函数)则被读入处 。内核镜像余下部分被读入 处(称为低地址,专为存放用"make "编译的小内核)或处(称为高地址,专为存放用"make "编译的大内核);在读入的过程中,存放map文件的扇区被读入处 。如果读入的image是Linux的内核,控制权将交给处于的Setup.S 。如果读入的是另外的操作系统,过程要稍微麻烦一点:chain 被读入到内存的处 。该操作系统用于启动的扇区被读入到 。chain 将把它所包含的分区表移到处,把引导扇区读入到 。做完这一切,它把控制权交给引导扇区代码 。