专业编程基础技术教程

网站首页 > 基础教程 正文

菜鸟windows下写个操作系统——实践(2)硬件系统启动

ccvgpt 2024-07-17 17:45:34 基础教程 22 ℃

硬件系统启动 --CPU的第一条指令

计算机的加电与复位:

菜鸟windows下写个操作系统——实践(2)硬件系统启动

首先我们脑子里必须要有个概念,CPU是向下兼容的,不管现在的CPU发展的如何强大,X86/X64体系他都要兼容8086,这是他们的祖宗,他们不能不认祖宗。(主要的原因是因为商业价值,当时不能丢掉老客户,也就这样继承来了)

在以X86/X64体系里,先要讲8086,当时只有20位地址线,就是2的20次方,寻址范围为0x00000----0xFFFFF(1M空间)

CPU在通电后,会复位CS段寄存器和IP指令寄存器,复位后的值如下:

CS: 0xFFFF

I P: 0x0000

所以CPU执行的第一条指令的地址:0xFFFF:0x0000=CS*10h+IP=0xFFFF0,先找这个地址存放了什么指令

1.写到这里还需要了解一个概念,就是地址线的分配并不是全部分配给内存条的:

打个比方:假设你有32根地址线,显存分配N根,网卡存储单元N根,声卡存储单元N根等等(具体要去了解硬件机制),所以假设你的内存条是4G的,又是32位的地址线,实际上你的内存条有一小部分空间不会被使用到。

2.第二个概念内存分为:

1>动态随机访问存储器(Dynamic Random Access Memory,DRAM) [ 内存条/显存/声存等等]

特点:访问任何一个内存单元的速度和他的位置无关。如:访问0x0000和0xFFFF所有的时间一样

断电后数据消失。

2>只读存储器(Read Only Memery,ROM) [主板上一个ROM芯片]

特点:数据是预先写入的,即使掉电数据也不会消失。

地址分配电路(1M内存):

DRAM:0x00000--0x9FFFF

ROM:0xF0000--0xFFFFF (1M内存的高64K,CPU执行的第一条指令从这里开始)

CPU复位后指向的这个内存地址需要一个很重要的特性:断电以后,这个内存里的数据不会消失。

那这个地方只有在ROM里了,我特别想知道CPU执行的第一条指令是啥,那就打开Bochs的调试版bochsdgb.exe,说干就干,安装目录下双击bochsdgb.exe,会弹出下图(主要是因为我们还需要配置bochsrc.bxrc)。

配置bochsrc.bxrc之前,我们得先创建一个硬盘镜像(.img)

1.运行-->CMD-->进入bochs的目录下(如果设置了环境变量可以不用进入,但为了方便还是进入一下)

2.bximage-->1-->hd-->flat-->100-->c.img

创建完硬盘镜像后,我们开始简单配置一下bochsrc.bxrc!

找到目录下的bochsrc-sample.txt,最好是复制一个文件,再修改,如果修改坏了,还能重新Copy回来

找到上面的ata0-master这里加个#号,取消第三行的#号,表示从硬盘c.img启动,然后将bochsrc-sample.txt重命名为bochsrc.bxrc,再次打开bochsdbg==》Load,就会出现下图:

从上图可以得知:

CPU执行的第一条指令的地址是:F000:FFF0

转成虚拟地址是:0xF000*10H+0xFFF0=0xFFFF0 他的代码为:jmpf 0xf000:e05b,我们知道0xf0000--0xfffff都是ROM的地址,由上得知确实第一条指令是从了ROM芯片里执行的,跳到的地址还是在ROM芯片里,主要是进行硬件的诊断、检测和初始化(比如建立中断向量表)(这个也是代码实现的,所以又叫基本输入输出系统(Base Input&Base Output System)Bios)。

当BIOS初始化后,会开始在内存中0x000-0x3FF建立数据结构、中断向量表IVT,并填写中断例程。

BIOS的最后一项工作:是校验启动盘中的位于0盘0道1扇区的内容(512字节),如果最后两个字节分别为0x55和0xaa,便认为这是可执行的程序,并把他加载到0x0000:0x7c00,随后JMP过来,这512字节就是大名鼎鼎的MBR。

目前我们只需知道B8000--BFFFF用于显存的(32K),7C00--7DFF(512B)以后这里都会用到。

Tags:

最近发表
标签列表