Linux启动过程

BIOS启动

1.加电时由硬件将BIOS加载到内存末尾.这时是实模式,寻址空间为1M.
2.由硬件将CS段寄存器强制设置为0xFFFF,IP指令寄存器设置为0x0000.这样CS:IP指向了OxFFFF0的地址位置.这个位置就是BIOS程序的入口地址.
3.执行BIOS程序.在内存起始地址0x00000设置1K大小的中断向量表.每个中断向量大小为4字节.中断向量保存的是中断服务的入口地址.
4.BIOS程序在紧接中断向量表后面设置BIOS数据区(256B).
5.BIOS程序在BIOS数据区后面56K的位置设置中断服务程序(8KB).
6.BIOS程序执行INT 0x19中断,CPU收到这个中断后,在中断向量表找到对应的中断服务程序入口地址.然后执行中断服务程序,把0盘面0磁道的1扇区512字节(MBR)数据加载到内存中的0x07C00位置.

启动引导程序

BIOS把MBR加载到内存后就功成身退了,将控制权移交给MBR,接下来就是MBR出场了.
1.MBR由汇编编写,大小为512B,主要的作用是加载操作系统的引导程序(Boot sector)到内存中.
2.引导程序加载内核kernel到内存对应的位置.
3.引导程序将当前实模式转变到保护模式.这期间做了大量工作:

  • 通过cli指令关中断.(sti指令开中断)
  • 将kernel复制到内存起始位置
  • 设置中断描述符表(IDT)和全局描述符表(GDT)
  • 设置页目录表和页表
  • 打开保护模式,设置CR0寄存器第0位为1;以及PG位,开启分页映射.
  • 准备执行main函数,控制权移交个kernel

启动内核

执行main函数,kernel开始启动,挂载initramfs,执行用户空间第一个程序init…

你可能感兴趣的:(kernel,启动,BIOS)