linux0.11系统的启动流程

计算机的启动流程

当我们按下开机键时,计算机会执行以下步骤进行启动:

  1. CPU进行初始化,并进入实模式
  2. CPU根据两个寄存器CSIP到内存的0xffff0处读取BIOS程序并执行
  3. BIOS提供一些最基本的I/O、硬件检查等的功能,它会到磁盘中引导程序,放到内存的0x7c00
  4. 0x7c00执行引导程序,读取加载程序,然后读取操作系统文件
  5. 执行加载程序,移动操作系统文件的位置,并进入保护模式
  6. 操作系统执行

上面有一些需要解释的概念。

实模式

最开始的CPU只有一个模式(实模式),后来又出现了保护模式,为了区分,就将最开始的这个模式称为实模式。

为什么叫实模式?

该模式下,程序员在程序中写的地址就是真实的物理地址,地址不会经过变换,这也可能造成安全问题。

为什么存在实模式?

实模式是古老的CPU的模式,现在的计算机已经不需要实模式了,但是为了向前兼容,实模式也就保存下来了。

实模式下的内存寻址方式

该模式下的寻址方式是 使用段基址与偏移地址求出真实地址 然后去取数据。

这种方式是为了处理8086处理器的一个问题而设计的:8086处理器有20根地址线,可寻址1MB内存,但其寄存器是16位的,只能存放64KB内存的地址。

为了解决这个问题,人们将1MB内存分成16个相同大小的段,每段64KB,然后用2个寄存器来记录地址:

  • 一个是段寄存器(CS),存放的是地址所在的那个段的编号
  • 另一个是指针寄存器(IP),存放的是地址在段中的偏移量

通过这两个地址可以访问内存的任意位置。

公式:真实地址 = (CS)*16(左移4位)+ (IP)

限制

由于实模式下只能访问1MB内存,因此BIOS必须存放在内存0-1MB范围内,准确地说,BIOS所在的开始位置为0xffff0

BIOS执行

0xffff0开始执行BIOS:

  1. 进行硬件检查
  2. 从硬盘中读取主引导记录到内存的0x7c00
读取过程的细节

BIOS读取硬盘第一个扇区中的主引导记录(MBR),MBR512B,其中446B的启动代码用于检查MBR是否正确以及读取加载程序,另外的4*16B存放4个分区的信息,最后2B表示结束标志0x55AA

启动程序执行

  • 将自己移动到0x90000
  • 从硬盘中读取加载程序到内存的0x90200
  • 读取操作系统到0x10000

加载程序执行

  1. 读取系统参数,如内存大小,放在内存的0x90000处(覆盖了启动程序),进行初始化
  2. 将操作系统文件从0x10000移动到0x00000处开始
  3. 加载IDTGDT
  4. CPU进入保护模式
  5. 运行操作系统
如何进入保护模式

将寄存器cr0的最后一位置为1,即进入保护模式

保护模式下的寻址方式

与实模式下不同,此时CS称作选择子,根据CS的值到GDT表中查找段基址,然后用找到的段基址与IP中的值求和,得到真实地址。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值