写一个操作系统_02 硬件与BIOS

硬件与BIOS流程

硬件

   传统来说,主板上两个主要芯片,靠上方的叫北桥,靠下方的叫南桥。

   大体上说:北桥负责与CPU通信,并且连接高速设备(内存/显卡),并且与南桥通信;南桥负责与低速设备(硬盘/USB)通信,时钟/BIOS/系统管理/旧式设备控制,并且与北桥通信。

   Intel从第一代Core i7 (i7 9xx)开始,将原属于北桥功能的内存控制器整合到CPU当中,在主流机Core i中(i7 8xx)更将PCI-e控制器(主要负责连接显卡)整合到CPU当中,这时候传统意义上的北桥的所有功能都已经整合到CPU内部了,所以Intel 50系芯片“组”(X58除外,这是搭配i7 9xx用的,还有北桥)已经没有传统意义的北桥了,而南桥依然负责处理低速设备(SATA/USB/PCI等)、时钟等功能。

CPU的第一条指令

   正常人开机都是等到操作系统加载完毕,进入操作系统然后开始使用应用软件,在高度抽象的角度使用CPU、内存、显卡等硬件。从CPU执行每一条指令的角度,这个过程又可以分为几十个子过程,并且经过了几十年的发展优化。

   我们来看一下CPU的第一条指令,CPU遵循着最简单的工作模式,从CS:IP 拿到内存的地址,取址执行,但是当主机刚刚上电,内存数据还没有初始化的时候,第一条指令从哪里来呢?CPU毕竟是硬件设备,也需要搭配硬件设备工作,有一类内存是掉电数据不丢失的,比如EEPROM(电可擦除可编程只读存储器),它被广泛用于需要经常擦除的BIOS芯片以及闪存芯片; DRAM:动态随机存取存储器,一般指物理内存….

  Intel的CPU具有很好的向后兼容性。在16位的8086 CPU时代,内存限制在1MB范围内,且BIOS的代码固化在EPROM中。在基于Intel的8086 CPU的PC机中的EPROM被编址在1MB内存地址空间的最高64KB中。PC加电后,CS寄存器初始化为0xF000,IP寄存器初始化为0xFFF0,所以CPU要执行的第一条指令的地址为CS:IP=0xF000:0XFFF0(Segment:Offset 表示)=0xFFFF0(Linear表示)。这个地址位于被固化EPROM中,指令是一个长跳转指令JMP F000:E05B。这样就开启了BIOS的执行过程。

image

这个过程有CPU硬编码的地方,比如上电后CS:IP的地址是0xFFFF0,BIOS的地址也是固化的,这个玩意就是标准,你没办法单独搞一个。

BIOS的工作

  BIOS主要完成外设的检测以及中断向量表的初始化,外设的初始化信息和检测信息一般在自己的固件上,供BIOS调用。BIOS读外设固件的信息,在实模式内存的0x000 – 0x3FF 建立可操作硬件的中断向量表,每个中断向量占用4个字节,共可存储256个中断向量。这样就可以通过 ‘int 中断号’实现对应的硬件调用。

  历史在发展,科技在进步,目前的BIOS逐渐被UEFI取代,不过其基本作用是一样的,BIOS也更好理解。

完成历史使命

  BIOS做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那个地址继续执行。至此BIOS的初始化工作做完了。

  CPU的控制权交到了 0x7C00, 如果我们把操作系统放到磁盘或光盘,接下来就可以加载操作系统到内存,执行我们的操作系统了。

  那是一片更广阔的天地。
image
图为苹果计算机的第一代产品

-->