计算机探秘(一)——CPU,主板与内存

最近打算翻译一系列文章来总结一下自己关于计算机内部结构的基本知识。系列文章的背景针对的是Linux操作系统以及Intel x86_64系列处理器和芯片组。
原文链接:
http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map/

本文主要内容包括CPU的模型,主板的结构,CPU访问内存的方式以及系统内存映射图。

首先我们跳过Intel x86_64 CPU的具体实现,把它看成一个模型。这个简化的CPU模型包括以下部分:寄存器,Cache,MMU以及针脚。这里着重说一下针脚(pin),因为它是CPU与外界沟通的唯一方式。


计算机探秘(一)——CPU,主板与内存_第1张图片
Intel 80486DX2 CPU针脚

CPU的针脚连接到主板的前端总线(Front-end Bus)上,进而与北桥芯片组相连。不同的针脚用途不同:有传送物理内存地址的,有传送数据和指令的,也有用来传送中断信号的。例如Intel Core 2 QX6600 CPU有A[35:3]这33根针脚来传送8位对齐的物理内存地址,D[63:0]这64根针脚传送要读或者写的64位的数据。那么该CPU理论上所支持的最大物理内存是2^33 * 64 = 2^39 bit =64GB。

CPU运行有三个模式,实模式,32位保护模式以及64位保护模式。实模式下CPU支持最大1MB内存寻址,32位CPU支持最大4GB内存寻址。

另外,CPU在保护模式下执行程序的时候访问的内存地址实际上是逻辑地址(logical address),必须由MMU进行翻译成物理地址之后才能发往总线。

接下来我们来看主板的模型如图所示。

计算机探秘(一)——CPU,主板与内存_第2张图片
主板内部结构

北桥会收到来自CPU的一系列物理内存地址请求,北桥需要根据内存映射(Memory Map)决定应该这些地址是应该发往RAM,Video Card,还是南桥芯片组。Linux系统下可以查看/proc/iomem文件来列出内存映射图。

计算机探秘(一)——CPU,主板与内存_第3张图片
内存映射图(前4GB)

具体物理内存地址和各区域范围根据不同芯片组和主板型号而定。棕色区域是从内存中划出的部分,注意到外设的地址也需要占用内存地址空间,这就是为什么32位操作系统安装了4GB内存后可用空间不到4GB的原因(除非使用Physical Address Extension技术)。

不过,CPU在64位保护模式下运行时,这些被硬件占用的内存地址空间可以通过映射到比实际RAM更大的内存地址这种方式来重新获得访问。这就是回收内存(reclaiming memory)技术。它需要主板芯片组的支持。

小知识:A20线

Intel 8086处理器有20根地址线,但是寄存器只有16位。为了使16位的寄存器能寻址20位地址,处理器使用段地址16+偏移地址的方式来寻址。段地址和偏移地址分别存储在段寄存器(例如CS)和偏移寄存器(例如IP)中。
但是如果段地址
16+偏移地址大于0xFFFFF(这个值是20位地址线所能表达的最大地址值),处理器采取的措施是回滚到较低的地址。例如,CS=0xF800,IP=0x0800这个地址指向的物理地址其实是0x0000。
接下来的Intel 80286处理器有24根地址线,支持16M地址空间,于是F800:0800这个地址指向的就是正确的0x00100000而不是0x00000000这个回滚地址了。这样就导致了一些DOS程序不兼容80286处理器。
为了保持兼容,CPU和总线之间的A20针脚上被加了一个A20逻辑门,在计算机启动的时候BIOS会启用A20线并且做系统内存自检,之后禁用A20线并把控制转交操作系统bootloader。
在x86保护模式的操作系统中我们需要启用A20线来获得对内存的访问。

参考引用:
http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map/
http://en.wikipedia.org/wiki/A20_line

你可能感兴趣的:(计算机探秘(一)——CPU,主板与内存)