故事的开始_ch1_操作系统启动总揽

基本常识

  1. BIOS: 是指主板硬件厂商, 在主板上烧写的固件程序,也就是说BIOS 是一段存储在主板上的程序, 当然,你可以联系厂商,索要他们的BIOS 各个版本的固件程序;

  2. 内存: 通常是一个长方形的内存条;

  3. 启动设备: 是指包含了一个bootsect.s 文件的设备, 该文件是汇编代码,大小为 512 字节, 作用是负责引导操作系统的启动;(bootsect.s 通常存放在电脑的硬盘上,而当我们使用U盘给电脑装系统时,bootsect.s存放在U盘上;)

(所谓能够引导系统的启动设备,是指包含了启动文件bootsect.s 的设备, 该文件的大小512KB, 正常情况下在电脑硬盘上。

装系统时,会存在U盘中, 使用U盘装过系统的同学,应该体会到,会让你选择一个启动顺序,系统从哪个盘开始启动。)

  1. 引导扇区就是启动设备的第一个扇区, 启动设备信息被设置在CMOS中CMOS: (64B-128B)。用来存储实时钟和硬件配置信息。

打开电源开机后, 计算机执行的第一条指令从何而来?

计算机的本质, 取指执行 , 即取指令, 执行指令。
那么最初开机时, 指针IP 指在哪里? 执行的指令又是什么?

对于X86 机器而言:

  1. x86 PC 开机时,处于实模式;
  2. 此时, CS=0XFFFF, IP=0X0000;
  3. 寻址到 0XFFFF0 , 到达ROM BIOS 区域;
  4. BIOS 进行硬件检查, RAM, 键盘,显示器,内存,硬盘等;
  5. BIOS 将启动设备的0磁道,0扇区的内容读入到内存0X7C00处;
  6. 设置CS=0X07C0, IP=0X0000;

因此,开机后, 在执行完 BIOS 后, 硬盘上的第一个扇区上存放着第一个我们可以控制并修改的程序。

使用汇编语言编写 bootsect.s 的原因是为了实现对硬件精准的控制,
而c语言通过编译生成后的汇编, 会产生出一些意外的语句, 这在硬件启动过程中, 是不允许发生的。当然了, c语言和C++ 语言相比于其他语言的优势, 能够对内存实现更加精准的控制。

在汇编语言中:经常遇到表达说, 左移四位,注意这里所说的左移四位 指的的是二进制中左移4位, 即乘上了 2 4 2^4 24, 即乘上16倍。

而在汇编语言中, 由于通常数据表示成 16 进制, 故二进制左移四位即代表了十六进制中左移一位。

1. 操作系统启动的引导流程

首先, 先大体说一下, 系统启动时的总体顺序, 然后再依次介绍 bootsect.s , setup.s, system模块 这三个文件的作用。

1.1 整体顺序

在这里插入图片描述

当电源开启时, CPU主要完成两大任务, 将程序读入内存, 初始化硬件资源分配。

  1. cpu 会执行主板中的BIOS 程序, BIOS 程序会将bootsect.S 载入到内存中oX7c00处。

  2. boosect.S 的移动自身在内存中的位置,从oX7c00 移动到oX90000处,然后开始执行。

  3. boosect.S 执行过程中,并且将setup.s 载入到内存0x90200system 模块载入到内存0x10000 处。

  4. setup.s 开始执行, 将system模块从内存0x10000 处移动到0x0000处, 并且从实模式切换到保护模式。

  5. system模块中,前两个依次执行head.s , main.c . 依次执行这两个文件。
     alt

    图片2, 各个时间段文件的作用

1.2 实模式和保护模式的切换

注意, 其中 bootsect.Ssetup.s 是运行在实模式的机制下, 所以此时使用的是16位的汇编代码, 写成的;

当运行到system 模块时, 此时便切换到了保护模式下, 此时head.s 是32 位的汇编;

所以,bootsect.s 和setup.s是实时模式下运行的16位代码程序,采用近似Intel语法,

而head.s使用GUN汇编格式(AT&T),并且运行到保护模式下。

操作系统的启动过程中, 涉及到汇编种类如下:

  1. 实模式下的 16位 汇编的 运行机制;
  2. 保护模式下的 32位汇编的运行机制;
  3. 保护模式下,内嵌汇编, 即在C语言中内嵌了汇编代码, 为了实现对部分硬件的精准控制。

注意:实模式和保护模式对应,实模式的寻址CS:IP(CS左移4位+IP), 和保护模式(32位汇编模式下)不同。

在这里插入图片描述

三种不同类型的汇编

2. 三个模块文件的总览

所谓的三个重要模块,是指 bootsect.S, setup.S, system模块,

而BIOS 文件是由硬件厂商固化在主板上的.

BIOS 的功能作用, BIOS 程序主要完成了以下功能任务:

  1. BIOS完成硬件自检. 开机以后,BIOS将对CPU、内存、显卡、键盘等设备进行初步检测,如果硬件自检成功后,开始将下一步。
  1. 时间段1: BIOS 将bootsect.s 读入到内存中. 检测出第一个能够引导系统的设备,比如硬盘或者U盘或者光驱(现在电脑多数没有了), 将其中的bootsect.s 读入到内存中 ox7c00的地址处, 对应图片中的时间段1.

以下, bootsect.s , setup.s, system模块 运行顺序,结合这张图的时间轴理解:
 alt

各个时间段文件的作用

2.1 bootsect.S 的作用

这里介绍重要的功能作用, 其他更加具体的作用,在分析该文件时,进行介绍。

  1. 将自身的位置移动,对应图中的时间段2: bootsect.S 刚开始由BIOS 载入内存中的时候, 是放在内存ox7c00的地址处, 现在在执行的过程中, 他将位置移动到0x90000 处, 将原来的位置腾出来, 给其他人使用。

  2. 时间段3: bootsect.Ssetup.s 拷贝到内存中, 放在ox90200处, 为什么呢, 因为 bootsect.S占用了512KB 的大小, 表示成十六进制是 2 ∗ 1 6 2 + 0 ∗ 1 6 1 + 0 ∗ 1 6 0 = 200 2 * 16^2 + 0 * 16^1 + 0 * 16^0 = 200 2162+0161+0160=200, 所以为了将setup.s 放在bootsect.S 的后面, 故放在往后移动的512 K个字节处。

  3. bootsect.Ssystem 模块读入到内存的0x10000 处, 时间段3。

2.2 setup.s 的作用

  1. 执行自身过程中, 从bootsect.s 中获取机器的硬件信息, 参数等,在时间段4。
  2. sytem 模块从内存的0x10000 处移动到ox0000处, 时间段5,
  3. 从实模式切换到 保护模式, 开始执行 system 模块。此时所有的32位运行方式的设置启动被完成:IDT,GDT和LDT被加载,处理器和协处理器也确认,分页工作也设置完成。

2.3 system 模块的作用

system 模块中 包含了head.S 文件, 以及main.c文件,

注意到, 当运行到 system 模块时, 此时已经切换到保护模式进行运行 ,因此,此时head.s 是32 位的汇编;

  1. head.S : 初始化一些GDB 表, 初始化一些页表, 然后调到main 开始执行;
  2. main.c :初始化硬件资源分配, main 的工作就是 xx_init: 内存、中断、设备、时钟、 CPU 等内容的初始化 … 如图3 中的各种初始化;

3. 依次介绍三个文件

后面的三篇文章, 依次介绍

  1. bootsect.s ,
  2. setup.s,
  3. system模块 中的, head.S, main.c 文件。

4. . 操作系统的主体内容

在理解了操作系统的启动过程之后, 下面说明以下操作系统的主要内容。

1、进程管理
2、存储管理
3、文件管理
4、设备管理
5、系统调用

主要包含下面 五大基本成分;
内容可以参考这里出自于这里

在这里插入图片描述

图3, 主题内容

或者表述成:

  1. 分段、分页、
  2. 建立中断、设备驱动、
  3. 内存管理、
  4. 进程管理、
  5. 文件系统、
  6. 用户态接口等等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值