bootsect.S
,系统引导程序,一般不超过
512
字节。
在
PC
系统结构中,线性地址
0xA0000
以上,即
640K
以上用于图形接口卡和
BIOS
自身,
640K
以下为系统的基本内存。如果配置更多的内存,则
0x100000
,即
1MB
处开始称为高内存。当
BIOS
引导一个系统时,总是把引导扇区读入到基本内存地址为
0x7c00
的地方,然后跳转到此执行引导扇区的代码。这段代码将自身搬运到
0x90000
处,并跳转到那继续执行,然后通过
BIOS
提供的读磁盘调用“
int 0x13”从磁盘上读入setup
和内核映像。其中
setup
的映像读入到
0x90200
处,然后跳转到
setup
的代码中。
从
0x90000
到
0xA0000
一共
64K
,
bootsect
仅占
512
字节,所以
setup
大小理论上可到
63.5KB
。
在
Linux2.4
版本以前,在最前面的
512
字节里保护了一个
mini “boot loader”
,只要拷贝启动代码运行就可从软盘启动;但在
2.6
版本中不再保护这样的
”boot loader”
,所以必须在第一个磁盘分区上存储一个合适的
boot loader
才能从软盘启动,软盘、硬盘和光驱启动都是一样的过程。
setup
进行映像的解压缩,从
BIOS
收集一些数据,在控制台显示一些信息。
基本内存中开头一部分空间是保留给
BIOS
自己用的,另一方面对于
Linux
内核的引导也需要保留一些运行空间,一共保存了
64K
。基本内存中用于内核映像的就是
8*64K=512K
,其中顶端留
4K
用于引导命令行及从
BIOS
获取需要传递给内核的数据。内核映像一般都经过压缩,压缩后的映像和引导扇区及辅助引导程序的映像拼接在一起,成为内核的引导映像。大小不超过
508K
的映像称为小映像
zImage
,早期版本放在
0x10000
位置处,否则称为大内核
bzImage
,放在
0x100000
位置处。
CPU
在
bootsect
时处于
16
位实地址模式,然后在
setup
的执行过程中转入
32
位保护模式。
Setup
从
BIOS
中读取系统数据(内存大小、显卡模式、磁盘等参数),将数据保存在
0x90000-0x901FF
,覆盖了
bootsect
的内容。设置
32
位运行方式:加载中断描述表寄存器
IDTR
、全局描述表寄存器
GDTR
;临时设置
IDT
表和
GDT
表,并在
GDT
表中设置内核代码段和数据段的描述符,在
Head.S
中会根据内核的需要重新设置这些描述符表;开启
A20
地址线;重新设置两个中断控制器
8259A
,将硬件中断号重新设置为
0x20
和
0x2f
;最后设置
CPU
的控制寄存器
CR0
(机器状态字)的保护模式比特(
PE
)位,从而进入
32
位保护模式运行;然后跳转到
head.S
中的
startup_32
执行。
对于小内核映像放在
0x10000
处,
Setup
会把
system
从
0x10000
移到
0x0000
开始处。对于大内核映像,
vmlinux
中