• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

[自制操作系统]第01次电脑启动过程


Recommended Posts

目录

一.导言

二。准备

第三,第一个软件中继BIOS

一、前言

我在学习操作系统的时候,看了唐子英出版的《计算机操作系统》第四版。总的来说,我觉得这本书写得不错,语言讲解通俗易懂。但是,阅读只是纸上谈兵,实用部分的缺失会导致你以为自己懂的知识点经不起推敲,无法清晰复述。所以后来我又查阅了一些其他资料,其中郑刚的《操作系统真象还原》是我最喜欢的一本书。我教你怎么写一个简单的操作系统,让我对以前书里的概念有了更清晰的认识。这一系列的文章都是作者在学习这本书时的一些学习笔记。虽然这本书有一些小错误,但它的缺陷并没有被掩盖,它仍然是我认为学习操作系统最好的书籍之一。另外,我要感谢博客公园的博主Flash。我在写这一系列操作系统笔记的时候也参考了很多他的帖子。感兴趣的读者,我也强烈推荐阅读他的文章。

回到正题,我为什么要写这样一个系列?其实我喜欢做一些嵌入式Linux的开发工作,以后也想做,所以在日常学习中难免会和操作系统有一些打交道。我不是培训班出来的,需要自己补这方面的基础,所以有这样一个系列。希望读者见谅。我只是把它当做自己学习的笔记,以后可以回来复习,不敢命名为教程。如果我能帮助别人,我是幸运的。对于帖子中的错误,我虚心接受读者批评指正。

二。准备工作

本系列是在Bochs平台上编写的基于x86架构的32位操作系统,所以我们有必要对x86架构有一个简单的了解。

1978年6月8日,英特尔发布了全新的16位微处理器“8086”,也迎来了一个新时代:x86架构诞生。X86是指由特定微处理器执行的一些计算机语言指令集,它定义了芯片的基本使用规则。后来,随着对性能要求的提高,英特尔推出了越来越多性能更强的处理器,如80286、80386、80486、奔腾系列等。这些处理器有什么区别?我就简单介绍一下这三款处理器。

kb1xht4ycbi5150.png

从上图可以看出,CPU升级后,地址总线的宽度和寄存器的宽度都相应增加,这样做的好处是CPU的运行速度相比之前有了明显的提升。

可以看出里面提到了实模式和保护模式的概念。其实这个概念是后来人们为了区分CPU的运行模式而人为加入的。

起初x86架构的CPU是8086,它所有的寄存器都是16位的,只有地址线是20位的,所以它的存取空间的方式是将段基址寄存器左移4位加上段偏移地址,这样最终形成一个物理地址并发送到地址总线上。这种寻址方式在现在的我们看来有点陌生,但也是当时工程师提出的解决寄存器位和地址总线宽度不匹配的方法。

有两个缺点。首先是可利用的空间太小,跟不上计算机发展的需要。二是保护机制的缺失。程序可以随意访问这个1M的地址空间,甚至可以覆盖操作系统本身的代码和数据。

随着操作系统的发展和需求,迫使CPU发展,于是80286,80286地址总线扩展到24位,拥有16MB地址空间。此外,80286通过段选择器保护存储器,具有许多新的特点。但是为了兼容老程序,需要支持16位计算机的特性,所以有两种模式,程序要通过调用一些CPU指令从一种模式切换到另一种模式,比如经典的A20地址线打开。

8286虽然有保护模式,但仍然是16位CPU,其通用寄存器仍然是16位宽,即单个寄存器只能访问64KB的空间。如果该寄存器用作段中的偏移地址,则段大小仍为64KB。如果要访问完整的16MB内存,还是要不断改变段基址,所以本质上和8086没有太大区别,这就导致了80286和80286的比较。后来80386出现了。32位地址线和32位寄存器直接一步解决了问题,还支持保护模式。

这两种模式,其实按照更准确的理解,可以称为16位模式和32位模式,然后补充一点,32位模式比16位模式有更大的寻址空间(这是自然的)和更好的内存保护机制。但由于CPU厂商想突出自己新模式的优势,就直接把最关键的优势“保护”放在了名字里,称之为保护模式。为了比较,也要给之前的型号起个名字。之前的模型更真实。给什么地址直接就是物理地址,没有转换,没有安全保护。姑且称之为真实模型吧。

现在我们只需要知道8086处理器运行在实模式下,随着处理器的升级,下面的处理器可以运行在保护模式下。至于为什么80386一开始运行在实模式,后来又切换到保护模式,其实也是说为了兼容性,每一个产品都要兼容之前的设计,这样客户才能付费。

为了Inte

l8086,我们可以看到它20条地址线,故可以访问到2^20=1048576=1MB的内存空间,若是按照十六进制来表示,则是0x00000~0xFFFFF。下面是实模式下的1MB内存布局。

   bqnwphq1nol5151.png

  这里着重解释一个问题,也是以前我的一个认识的误区,我以前以为我们插在主板上的内存就是CPU眼中的内存,其实这个认识是错误的。首先我们知道地址总线宽度决定CPU可以访问的内存大小,如8086的地址总线是20位,那么可以访问的内存大小为1MB,80386的地址总线是32位,那么可以访问的内存大小为4GB。但是以上的地址范围是指地址总线可以触及到的边界,是指计算机在寻址上可以到达的疆域。并不是说寻址范围取决于内存条的大小,归根结底的原因是:在计算机中,并不是只有我们插在主板上的内存条需要通过地址总线来访问,还有一些外设同样是需要通过地址总线来访问的。所以,实际上CPU眼中的内存分布应该是这样的:

         zzm0iu0hg2g5152.png

  关于其中提到的地址映射,这是在硬件层面完成的工作,对操作系统来讲是透明的。

三、软件接力第一棒BIOS

  我之前挺好奇每次一按主机上的电源键,电脑是怎么启动并运行的。所以我去百度了一下:当电源打开后,PC做的第一件事情就是CPU从内置的芯片中加载一个最简单程序,这个程序叫做BIOS(基本输入输出系统,随后BIOS程序启动后就会检测并初始化硬件设备,比如显卡,内存等,随后将控制权交给硬盘,在硬盘中寻找主引导记录的分区,这个分区告诉电脑操作系统在哪里,最后CPU从硬盘上加载操作系统完成启动过程。

  所以接下来的工作先从BIOS开始。

  BIOS全称叫做Base Input & Output System,即基本输入输出系统,它是被固化在计算机ROM芯片上的一组程序。它的主要工作是检测、初始化硬件。如何初始化的呢?这里说一下题外话,硬件厂商会事先实现这些初始化功能,最后在外部提供调用接口就行了,BIOS只需要通过这些调用接口就能完成硬件的初始化。BIOS还建立了中断向量表,这样CPU就可以通过“int 中断号”的方式来实现相关的硬件调用。

  在前面提到的实模式下的内存布局中,我们知道BIOS代码就存放在0xF0000~0xFFFFF。访问这个地址便是访问BIOS,那么BIOS代码是如何被执行的呢?换句话说就是CPU是如何知道BIOS代码存放于此的呢?其实这是事先通过硬件电路实现的,没错,就是这么魔幻。当上电后,CPU的cs:ip寄存器自动被赋值为0xf000:0xfff0,这个组合出来的地址便是0xffff0,这是处理器下一条待执行指令的地址。这个地址就是我们的BIOS代码的存放地址。这个地址存放的代码如下:

  jmp far f000:e05b

  这是一条跳转指令,cpu跳转到0xfe05b地址处执行,其实也在意料之中,因为在内存布局图中可以看到,0xffff0距离0xfffff也就只有16字节的空间,这么小的空间怎么能够完成BIOS的一系列初始化工作呢?

  所以跳转到0xfe05b才是BIOS真正开始执行的地方。接下来BIOS便开始马不停蹄地检测内存、显卡等外设的信息,当检测通过并初始化好硬件后,在内存中0x000~0x3FF处建立中断向量表IVT并且填写中断例程。至此,BIOS的使命也就结束了,我觉得没有必要去深究BIOS的代码。因为底层无非就是一些调用接口完成初始化的代码。

  虽然BIOS完成了它的使命,但是我们还需要继续走下去,这里提一句,BIOS最后会检查启动盘的第一个扇区中的内容,如果此扇区中末尾两个字节分别是魔数0x55和0xaa,那么BIOS便认为此扇区中存在可执行程序(也就是后面我们要讲解的主引导记录MBR),便将此扇区的内容全部加载到物理地址0x7c00处执行。

  关于为什么是检查第一个扇区、为什么是魔数0x55和0xaa以及为什么是地址0x7c00?

  这里我就借用一下书上的解释:第一个扇区和魔数的问题,其实就是为了方便,一个约定俗成的规定罢了;那为什么是地址0x7c00呢?其实是取决于当时操作系统本身所占的内存大小和内存布局罢了。也就是工程师们绞尽脑汁想要榨取每一块内存区域的利用价值导致最后遗留下的结果。这个区域也许现在看来有点奇怪或者不合适,但是为了系统兼容性问题,这个0x7c00的地址就一直沿用到现在。

  总结一下计算机的启动过程:

  1. 首先按下开机键后,CPU将cs:ip寄存器强制初始化为0xf000:0xfff0,这样得到的组合地址便是0xffff0,这个地址便是BIOS程序所在位置。
  2. BIOS程序所在位置是一条跳转指令,CPU跳转到地址0xfe05b处开始执行。
  3. 0xfe05b处才算是BIOS真正开始的地方,在此处的程序中BIOS完成硬件检测工作以及建立中断向量表后,将启动盘中的主引导记录加载到内存0x7c00处并跳转执行。
  4. 主引导记录中的代码主要是加载操作系统内核,并跳转到加载处执行。
  5. 最后操作系统便开始执行了,最终呈现在我们的面前的便是图形化的操作界面等等。

  现在我们已经知道BIOS将控制权递交给了MBR,那么接下来我们便开始动手写一个自己的MBR程序,欲知后事如何,请看下回分解。

 

Link to comment
Share on other sites