当前位置: 首页 > news >正文

x86启动流程

两个角色:主板和CPU

主板:一旦被生产下来,它就只能干特定的事,灵活性为0。它的工作就是叫醒CPU,以及创造CPU工作所需要的一切环境。
CPU: 我们交给计算机的所有事情,最终都是由CPU完成的(暂时忽略GPU或其他计算核心)。但是CPU不会自己叫醒自己,它醒后,如果没有一定的环境,它也是无法工作的。

系统初始化(由纯硬件完成)

主板在上电后,CPU收到复位信号,进行初始化(由CPU自己完成,主要是调整自己的状态),初始化后,CPU情况如下:

  • CPU内部cs寄存器被初始化为0xf000,ip寄存器被初始化为0xfff0。
  • CPU工作在实模式(CPU有多种工作模式,不同工作模式的计算方式,可以干的事情(后文说的指令),实模式是其中一种模式,实模式下的地址的计算方式(寻址方式)为:指令地址=cs寄存器的值左移4位+ip寄存器的值)。

执行第一条指令

上面说到cs和ip寄存器被初始化为0xf000:0xfff0。也说明了实模式的寻址方式。所以第一条指令的地址为0xffff0。CPU从RAM中读到一条指令,这条指令是一条跳转指令,他会重新设置cs和ip的值。使得它指向名为BIOS的程序的第一个指令的地址,。

这里有个问题,内存0xffff0上面的指令,是谁写上去的?CPU什么事情都还没干,为什么内存中会有指令呢?
答:这个地址上面的指令是由主板电路,在CPU完成初始化前,写到内存上去的。主板上有一个叫ROM东西,这个东西断电后不会丢失数据,但是这个东西一旦生产完成,它的内容再也不能改了。ROM里面存放的是BIOS程序,这个程序是让CPU完成一些与具体操作系统无关的工作,具体什么工作在后文介绍。主板在CPU初始化完成之前,把ROM里面的BIOS送到内存特定的区域中(这个区域的地址从0xA0000到0x100000),0xffff0那里的程序就是在这个步骤中被写到内存中的。

执行BIOS程序

BIOS程序完成的事情有:

  • 检查计算机资源,比如各种设备的可用性(是不是坏了),有多少内存可以用。
  • 选择一个存储设备(磁盘等),把这个设备的第一扇区(最前面的512字节)的内容读到内存0x7c00地址开始的区域,然后修改cs和ip,使得CPU下一条执行的指令是0x7c00处的指令,也就是刚刚主板从启动盘第一个扇区那搬过来的程序的第一条指令。

执行操作系统的bootloader

从磁盘第一扇区那搬过来的程序就是bootloader,每个操作系统会给自己写一个bootloader,这个程序负责指导如何把操作系统加载到内存中(操作系统在磁盘的哪里,要放到内存的哪个位置),确定文件系统,以及如何进一步配置硬件环境(把CPU的工作模式从实模式切换到其他模式)等。具体代码每个操作系统都不同。在安装操作系统的时候,有一个步骤就是把这个操作系统的bootloader写到启动盘(由用户选定)的前512个字节。

运行操作系统

bootloader完成它的工作之后,会把cs和ip重新设置,使得CPU下一步执行的就是操作系统的第一个指令了。

相关概念

cs(段寄存器)是一个寄存器(硬件)
ip(指令指针寄存器) 是一个寄存器(硬件)
pc(program counter,程序计数器)是一个概念,32位整形,表示下一条指令的地址。它是由cs和ip计算得来,不一定有专门的硬件对应(当然有些CPU可能有单独的PC寄存器),它是个逻辑上的叫法。

相关文章:

  • [ROS2 入门] rqt_console 使用介绍
  • 丝绸之路也可以是科技传播之路
  • 技术分享 | 常用测试策略与测试手段
  • Kinect与TOF、双目、结构光相机比较相机国产、非国产统计参数对比分析
  • 【C语言】动态内存实现通讯录(malloc,calloc,realloc)
  • [MRCTF2020]Ezaudit(随机数的安全)
  • SpringAMQP - 发布订阅模式
  • Understanding LSTM Networks
  • SpringBoot统一功能处理
  • RCNN模型Python实现笔记一
  • STC15系列单片机EEPROM读写示例
  • [GYCTF2020]Blacklist(堆叠注入)
  • SM4算法学习笔记
  • NISP证书的含金量有多高,是否能够实现2023年月薪过万呢?
  • [Android]动画
  • 【JavaGuide面试总结】计算机网络·上
  • 【Linux】两个故事带你使用git命令行
  • 循环语句(循环结构)——“C”
  • 初识 Django(Python WEB 框架)
  • 用PYTHON自动登录SAP GUI