第1回 最开始的两行代码

本文详细介绍了BIOS如何从硬盘启动区加载512字节数据到内存0x7c00,并跳转执行。开机后,BIOS初始化PC寄存器为0xFFFF0,指向ROM中的BIOS。BIOS读取硬盘第一扇区,如果最后两个字节是0x55和0xAA,则认定为启动区。操作系统开发者只需将启动代码编译并存入硬盘启动区,BIOS会将其搬运到内存0x7c00,CPU从此处开始执行。Linux的启动代码始于bootsect.s,编译后存于启动区。这段代码首先设置ds寄存器为0x7c00,便于后续的基址寻址操作。
摘要由CSDN通过智能技术生成

当你按下开机键的那一刻,在主板上提前写死的固件程序BIOS会将硬盘启动区中的512(B)的数据,原封不动地复制到内存中的0x7c00这个位置,并跳转到那个位置:

下面我们针对每一步做详细介绍.

开机后初始化指向BIOS

CPU中有一个PC寄存器,里面存储这将要执行的指令在内存中的地址,当按下开机键后,CPU就会有一个初始化PC寄存器的过程,然后CPU按照PC寄存器中的数值,去内存中对应的地址寻找这条指令,然后执行之。

初始化的值是多少呢?Intel手册规定,开机后PC寄存器要初始化为0xFFFF0,也就是说从这个内存开始,执行CPU的第一条指令。这个值其实就是intel强行规定而已。

接下来你可能有一个疑问,不是说根据这个地址值去内存中找吗?怎么现在到BIOS里了?

其实这个地方我说的并不严谨,并不是去内存(RAM)中去找,二十把0xFFFF0作为CPU的地址线信号输出出去,去这个地址线对应的位置找。

哦?难道CPU的地址线连接的不仅仅是内存?没错,CPU地址线连接的有RAM(也就是常说的内存),有ROM(也就是上图中的BIOS),还有一些外设的IO端口,叫做Memory-Mapped IO,我们暂时不会涉及,参见下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值