计算机是如何把操作系统跑起来的

哈喽,我是子牙,一个很卷的硬核男人

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

瓦特,你还没看过搭建环境的那篇文章?
开发操作系统内核环境搭建

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

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

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

操作系统运行总览

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

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

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

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

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

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

在这里插入图片描述

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

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

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

第一个问题

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

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

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

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

第二个问题

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

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

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

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

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

第三个问题

问题是,为什么我们自己写的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,到这来就把操作系统是如何被电脑运行起来的细节讲明白了。你学废了吗?

结语

我是子牙老师,喜欢钻研底层,深入研究Windows、Linux内核、JVM。如果你也喜欢研究底层,欢迎关注我的公众号【硬核子牙

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值