龙空技术网

计算机启动知识 - 概述

岂曰无衣已 131

前言:

此刻小伙伴们对“寄存器左移两位怎么计算”都比较关切,姐妹们都需要分析一些“寄存器左移两位怎么计算”的相关知识。那么小编在网摘上收集了一些有关“寄存器左移两位怎么计算””的相关知识,希望看官们能喜欢,看官们快快来学习一下吧!

计算机电源打开后,主板会发送一个信号到供电设备,供电设备将会为计算机的运行提供电源。一旦主板收到电源信号良好的信号后,它就是启动CPU,此时CPU将会重置所有的寄存器,将寄存器设置为预定义的值。

在这里我们重点关注指令执行相关的寄存器,在 80386 后的CPU,处理器会设置 IP,_CS_等。

IP          0xfff0CS selector 0xf000CS base     0xffff0000

然后,CPU工作在 实模式,正如在内存寻址中所提,实模式 是所有Intel处理器开始工作的模式,它支持1M(0-0xFFFFF)的物理地址寻址,但由于寄存器只有16位,所以只能最大寻址到64KB(2^16 - 1)。为了解决这个问题,Intel开发出了分段,让处理器可以访问1M的内存空间。

PhysicalAddress = Segment Selector * 16 + Offset

这样,处理器最大就可以寻址20位的内存空间,从而能够完整访问这个1M的物理内存。例如在处理器运行的时候 CS:IP 的值为 0x2000:0x0010 ,那么访问的物理地址为

>>> hex((0x2000 << 4) + 0x0010)'0x20010'

在实模式寻址中我们也提过一个例外这个例外可能超过1M的内存空间,例如 CS:IP 的值为 0xffff:0xffff ,那么最终的寻址结果为

>>> hex((0xffff << 4) + 0xffff)'0x10ffef'

这个值将超过了1M的内存空间,在 A20地址线 被禁止的情况下,这个地址最终访问 0x00ffef 的物理地址。

由上文我们知道在实模式地址下,线性地址由逻辑地址的段寄存器左移4位,加上偏移量组成最终的物理地址,例如指令地址的计算方式就是CS << 4 + EIP。但在系统启动的时候CPU初始化需要注意,在内存寻址中我们说过段寄存器由可见段选择子和不可见的缓存组成,这个不可见的缓存主要是现代CPU加速指令地址的计算,其中最重要的包含了段寄存器的Base和Limit,在处理器初始化的时候,CPU将CS寄存器设置为0xf000,不可见的基址部分(Base)设置为0xffff0000,在实模式下,一般情况下Base的数据由段寄存器左移4位形成,但这里却不是,这是由CPU直接初始化而成。CPU将按照以下规则计算计算出第一个执行的指令地址,也就是EIP寄存器的值

>>> 0xffff0000 + 0xfff0'0xfffffff0'

所以CPU执行的第一个指令地址为 0xfffffff0 (4G下的16字节位置)。这个位置很特殊,叫做复位向量(reset vector )。是CPU启动后执行的第一个指令的位置,这个位置也是BIOS存放的位置,通常他包含一个 jmp 指令,然后跳转到 BIOS/UEFI 固件的代码位置。

这里所说的第一个执行指令的位置为 0xfffffff0,它已经超过了实模式下可寻址的1M范围,处理器为什么能够访问这个地址呢?在 coreboot 文档中写了这个原因

0xFFFE_0000 - 0xFFFF_FFFF: 128 kilobyte ROM mapped into address space

ROM将本身映射到了 0xFFFE_0000 - 0xFFFF_FFFF 地址上。而BIOS就存放在ROM中。所以CPU访问这个地址其实访问的是ROM中的内容。

至此,我们引入了我们这个一列文章的大头 BIOS/UEFI 。在早期ROM中存放的是BIOS的代码,但现代计算机中ROM中存放的是更加先进的UEFI。它们主要用于系统的自检,屏蔽各类硬件的差异,为操作系统提供统一的接口。BIOS由于是早期的设计,有很多的弊端,到现代逐渐会被UEFI所替代。

BIOS/UEFI 统称固件(firmware),它们中提供了一个很重要的功能就是加载操作系统,两者虽然有差异,但是都是为了顺利引导最终的操作系统。

BIOS/UEFI 需要根据配置引导顺序加载硬盘中的数据,但是它从哪个加载文件呢,但是文件存放在硬盘中,此时还没有文件的概念,那他从哪个加载,对于BIOS而言它加载磁盘的第一个扇区,对于UEFI而言,它加载根据引导的配置加载EFI系统分区中的内容。

对于BIOS而言,BIOS完成各种自检和本身的初始化后,它会根据配置的顺序查找引导扇区。但它通常不会直接将操作系统加载到内存中用于引导操作系统,而是通过一个操作系统加载程序进行操作系统的加载。 BIOS 将磁盘的第一个扇区(512字节)的数据加载到内存中,这512字节的数据对于操作系统的加载很重要,在BIOS中硬盘第一个扇区的512字节按照 MBR分区格式 。BIOS将第一个扇区的512字节加载到物理内存的 0x7c00 中,BIOS将程序控制转移到 0x7c00 继续执行,然后BIOS就将控制权交给了引导程序。后续的引导程序负责操作系统的加载过程。在这里,了解BIOS和MBR将有助于了解计算机系统启动的全过程。

而对 UEFI 而言,首先 UEFI 不是 BIOS,它是全新设计的固件,解决了 BIOS 中所存在的问题,这些问题将在每个章节中详细描述。UEFI 固件初始化处理器,内存,网卡,硬盘,显示器等等。通常它和 GPT 一起使用,GPT是MBR的继任者,它的出现同样也是为了解决MBR的缺点而存在。UEFI 会根据设置的启动顺序,查找GPT分区表中 GUID 为 C12A7328-F81F-11D2-BA4B-00A0C93EC93B 的EFI分区表。找到EFI分区表后,UEFI 将会把系统权限交给对应的引导程序,后续的引导程序负责引导操作系统启动。

不管BIOS,还是UEFI都遇到一个共同的问题,那就是它们都需要从硬盘中读取数据,那么既然有内存寻址,那么在硬盘中如何定位数据呢,老式的机械硬盘按照扇区作为最小寻址的物理单元,它通过CHS寻址,由于CHS的局限性,现代的磁盘一般都是通过LBA寻址,所以在这个系列我们也会介绍CHS和LBA的概念。对于CHS提供柱面,头,扇区来加载指定的扇区内容,但由于时代的限制,很多的设计当时认为已经够超前了,但到现在来看完全不够,比如通过CHS寻址的最大地址限制了磁盘的容量,而后来用于替代的LBA寻址,从早期的22位扩展到现在的64位,经历了几个过程,最早LBA最大支持22位,到后来扩展到28位,以及后来的48位,到现在最大支持64位。所以在计算机的发展中你会经常发现,各种规范都是在不断的修补丁的过程。至于现在的64位够不够用,谁知道呢?

通常硬盘的扇区最普遍的大小为512字节,也有更大的,下面的章节我们默认使用512字节扇区的硬盘。

标签: #寄存器左移两位怎么计算