知道计算机是怎样把操作系统跑起来的吗

电子说

1.2w人已加入

描述

之前不是给大家发了个开发操作系统的环境搭建教程吗?这不,又给自己找了一堆事。大家环境搭起来了,有环境写内核了,问题就出来了。这篇文章就是整理的大家问的比较多的问题,还有我自己写操作系统的一些问题,及研究后的一些心得体会

操作系统是任何一个想成为技术大牛的小伙伴必学的知识点。每个coder接触的所有知识点,都是起源于操作系统。你可能想象不到,学会了操作系统,对于一个coder,是一件多么有意义的事情。我还是建议大家抽空学一学、写一写。当然如果你希望有人教,欢迎加入我的手写操作系统小班

一个coder不想成为大牛,结局就是被淘汰

考虑到有些小伙伴没写过操作系统,我从操作系统是如何被运行起来的角度来写这篇文章吧。相信如黑洞般的操作系统启动过程,小伙伴们都存在着很多困惑及渴望解开谜团的好奇心

01

操作系统运行总览

想探究这个过程,只有你自己写操作系统才有这样的机会。因为真实机器,你没法调试,看不到这个过程

当你写好了一个OS内核,用bochs运行起来,你会发现bochs停留在一个断点处。这个断点所在的内存地址是0xfffffff0,如图。

coder

注意:这时候还没有运行你写的OS内核,更进一步说,你写的OS内核都还没有装入内存

这里引出来第一个问题:当我们运行我们自己写的OS内核的时候,bochs为什么会在0xfffffff0处停下来

接下来第二个问题:0xfffffff0处的汇编指令是jmpf 0xf000:e05b,跳过去要执行的代码是做什么的?

当把0xfe05b处的代码执行完,会跳转到地址0x7c00,这里是我们写的OS内核开始的地方

coder

第三个问题就是:为什么我们自己写的OS内核要载入到0x7c00,为什么不是其他的内存地址

这里为什么显示的是0x7c02呢?因为我们下的断点占两个字节,bochs从断点的下一行开始显示,所以如此

接下来咱们一个问题一个问题的分析

02

第一个问题

问题是,我们用bochs运行我们写的OS内核,为什么会停留在0xffffff0处?

我们反着来推,如果我们写的OS内核需要运行起来,之前需要完成内核的加载,在加载内核之前需要知道我们写的OS内核是存储在硬盘中还是软盘中,根据不同的存储介质,使用不同的方式进行读取。还有,运行OS内核需要内存,在运行之前是不是要检查下有没有插内存条……

综上,在运行OS内核之前,其实要做很多事情,这些事情由谁来做呢?BIOS例程。BIOS例程是写死在主板ROM中的一段程序。如果你经历过电脑开机启动不了,你可能就听过维修人员说这样一句话:刷主板ROM试试

为什么要提到BIOS例程呢?因为0xffff0就是BIOS例程的入口地址。停留在这里,就是让你有机会去调试BIOS例程,看它是如何检测硬件、设置中断、载入内核、交出执行权

03

第二个问题

问题是,0xfffffff0处的汇编指令是jmpf 0xf000:e05b,跳过去要执行的代码是做什么的?

其实前面也提到了,做硬件检测,比如检测有没有插内存条,内存条容量;有没有接入存储介质,接入了几块…检测完硬件就需要填充中断向量表,然后将我们写的内核代码读入内存……最后把执行权限交给OS内核。怎么交呢?代码类似于jmpf 0x7c00

为什么内存条松了开不了机,知道原因了吧

当时研究这个问题的时候,我在想,为什么要跳转呢?讲0xfe05b作为BIOS例程的入口不就可以了吗?我也尝试找了各种资料:Inter手册、BIOS规范,没找着答案,所以这个问题木有答案,大家就当纯粹一听。

当你走到一定高度,你会非常苦恼,因为计算机不是发源于我们国家,而且我们不是生活在那个年代,导致资料特别少,而且有些设计由于历史原因流传下来,又没有资料说明,找不到答案

04

第三个问题

问题是,为什么我们自己写的OS内核要载入到0x7c00,为什么不是其他的内存地址?

这个也是由于历史原因。

0x7C00第一次出现在IBM PC 5150的BIOS处理int 19(19号中断)的时候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先,这款PC于1981年发布,使用了intel8088(16位)的处理器和16KB的RAM内存,BIOS和微软的基本指令均放在该内存中。当打开电源,BIOS开始自检,然后出发 19号中断,在处理19号中断时,BIOS检测电脑是否具有软盘、硬盘或是固定磁盘,如果有任何可以使用的磁盘,BIOS就把磁盘的第一个扇区(512B)加载到内存的0x7C00地址处。

那0x7C00是怎么算出来的呢?那时候计算机的最小内存是32K,为了把尽量多的连续内存留给操作系统,主引导记录就被放到了内存地址的尾部。由于一个扇区是512字节,主引导记录本身也会产生数据,需要另外留出512字节保存。所以,它的预留位置就变成了:

0x7FFF - 512 - 512 + 1 = 0x7C00

0x7C00就是这么算出来的

OK,到这来就把操作系统是如何被电脑运行起来的细节讲明白了。你学废了吗?

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分