文章插图
如果我们将两个4G内存插入内存插槽 , 得到的内存地址空间是0到8G吗?是不是0到4G是第一根内存 , 4到8G是第二根内存呢?实际情况相差甚远 , 内存在物理地址空间的映射是分散的 。一部分原因是4G以下有Memory map IO(mmio)空间和PCIe的配置空间 , 另一个原因是Interleaving会打撒内存地址到各个Channel、DIMM甚至是Rank和bank上 。今天我们就一起来了解一下x86系统的地址空间分布 。
物理地址空间一个典型的物理地址空间是这样的:
文章插图
其中只有灰色部分是真正的内存 , 其余都是MMIO 。而内存被分为High DRAM和Low DRAM , 如图:
文章插图
为什么要把内存强行分割成两块呢?因为历史的包袱 。最早内存都很小 , 32位的地址(4G)空间看起来永远也用不完 , 低地址被分配给内存用 , 高地址就自然而然被分配用来给Memory map IO 。既然已经分给它们了 , 为了兼容以前的驱动 , 这一块就被固定下来 。再有内存就只能从4G以上分配了 。
Low MMIO和High MMIOLow MMIO结构如下图:
文章插图
其中有几块要特别说明一下:
1.Boot Vector的空间是BIOS内容映射的地址 , 它的大小是可以调节的 , 为了满足不同大小的BIOS 。
2.Local APIC是APIC中断模式各个内核local APIC寄存器的映射地址 。
3.PCI ECAM也有叫做PCIBAR , 是PCIe配置地址空间的映射地址 。它的起始地址可调 , 台式机BIOS一般会把它设置得很高 , 这样4G以下内存会比较大 , 方便32位windows使用 。举个例子 , 如果我们把PCIe BAR(BEGREG)设为0x80000000 , 那么尽管插了8G DIMM , 4G以下也不会超过2G的内存可以使用 , 而2到8G的真实内存都被映射到在4G地址空间以上了 , 而这些是32位Windows使用不了的 。所以有的主板运行32位操作系统发现可用内存小了一大块就是这个原因 。它的大小可以修改 , 一般可以设为64MB和128MB 。
High MMIO被BIOS保留作为64位mmio分配之用 , 例如PCIe的64位BAR等 。
Low DRAM和High DRAM4G以下内存最高地址叫做BMBOUND , 也有叫做Top of Low Usable DRAM (TOLUD)。BIOS也并不是把这些都报告给操作系统 , 而是要在里面划分出一部分给核显、ME和SMM等功能:
文章插图
红框中是在low DRAM被“偷”的部分
4G以上的内存最高端叫做Top of Up Usable DRAM (TOUUD) , 再上面就是High MMIO了 。
1MB以下比较特殊 , 里面全部都是已经被淘汰的传统BIOS和DOS关心的内容 , 我们叫它DOS Space或者Legacy Region:
文章插图
在那里 , 我们习惯用传统的实模式地址来划分它们的具体内容:
1.0~640KB , 传统DOS空间 。
2.A段和B段 , 传统SMM空间 。VGA的MMIO也被映射到这里 , 可以通过寄存器切换 。
3.C段和D段 , legacy opROM映射空间和EBDA空间 。
4.E段和F段 , BIOS空间的Lower和Upper映射地址 。BIOS的rom内容也会被映射到这里 , 方便Legacy BIOS实模式跳转到保护模式 。
内存的Interleave从前面可以看出内存在地址空间上被拆分成两块:Low DRAM和High DRAM 。那么在每块地址空间上分配连续吗?现代内存系统在引入多通道后 , 为了规避数据的局部性(这也是Cache为什么起作用的原因)对多通道性能的影响 , BIOS基本缺省全部开启了Interleaving , 过去美好的DIMM 0和DIMM 1挨个连续分配的日子一去不复返了 。
什么是Interleaving?简单来说 , 就是让内存交错起来 , 如下面的动图:
文章插图
来自wikipedia, 参考资料1
这是一个bank层级的模4的interleaving 。在桌面电脑上 , 常见的还有Channel级的、DIMM级的和Rank级的 。
推荐阅读
- 弗兰肯斯坦小说简介 第一部科幻小说弗兰肯斯坦是由作家雪莱创作的对吗
- 淘宝主播怎么上架我的商品 淘宝直播上架宝贝怎么弄
- 快速了解正向代理与反向代理
- WEB 应用防火墙 是什么,部那里,如何用和为什么?
- 不懂茶 难道不是你生的遗憾
- 好白茶是晒出来的
- 茶艺不是件容易的事
- 什么是茶艺
- 茶艺不是作秀 是中华文化的传承
- 沙参的营养价值是什么