内存分布之MMIO

本博客只要是用于总结工作之中所学知识,由于初学还有不足之处,望指正,博文中部分知识来自网络,大部分知识来自于Intel processor datasheet Baytrail平台。

博文内容归纳如下:

1. MMIO的基本概念
2. 映射地址空间
    2.1 DOS Legacy Address Range    
    2.2   Main Memory Address Range (1 MB - TOLUD)
    2.3 PCI* Memory Address Range
    2.4 Main Memory Address Space (4 GB to TOUUD) 
3. MMIO映射实例



1. MMIO的基本概念

MMIO(Memory mapping I/O)即内存映射I/O,它是PCI规范的一部分,I/O设备被放置在内存空间而不是I/O空间。从处理器的角度看,内存映射I/O后系统设备访问起来和内存一样。这样访问AGP/PCI-E显卡上的帧缓存,BIOS,PCI设备就可以使用读写内存一样的汇编指令完成,简化了程序设计的难度和接口的复杂性。I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O)。(来自百度百科)
简而言之,MMIO就是通过将外围设备映射到内存空间,便于CPU的访问。

小概念:
32位操作系统,32bit的处理器,拥有32bit寻址能力,即可访问2^32=4G的物理地址,那么就具有4G内存的识别能力。
物理地址:并不是指物理内存的地址,而是指处理器和系统内存之间所用到的地址,可以理解为CPU最为方便访问的地址(有别于我们之前所知道的物理地址的定义:段地址*16+偏移地址),而这一个内存并不独属于物理内存,而被分成了很多部分,物理内存当然也能够占用其中的一部分。
地址范围:0x0000 0000   -------->0xFFFF FFFF



需要注意的是,我们所提到的4G物理地址和所安装的内存条没有任何关系,是相互独立的。


该截图来自Baytrail平台安装2G内存,使用32bit操作系统。


截图来自(Baytrail-M,CPU N2809)
即使安装的是2G内存,但计算机依然会分配4G的内存空间。



2. 映射地址空间

目前,大多数的CPU都支持36bit寻址,也就是说寻址范围达到了64G,但这只是从“系统”的视角来说,从“内存控制器”的视角来说,由于32bit的寻址能力的限制,只能访问4G空间。如果需要计算机正常工作,则所有必须的设备地址都需要存在这4G的空间当中,使计算机正常工作除了内存之外,也包括许多IO设备。图中展示了4Gb地址的大致分布,除去main memory之外,大多数都只占据极少的内存,一般为几M或者几十M,除了PCI ECAM。(PCI Memory range)



2.1 DOS Legacy Address Range 



DOS Area (0h – 9_FFFFh) :这640KB大小的空间总是由CPU去控制映射到这个地址。
其具体内容为:




Legacy Video Area (A_0000h-B_FFFFh) 
传统128 KB VGA存储器范围帧缓冲器(000A_0000h 000B_FFFFh)可映射到IGD(器件2),PCI Express(器件1或器件6)或DMI接口。具体的映射取决于启用哪些器件以及VGA编程设置。基于VGA设置,VGA映射恒定的设置为高优先级。处理器总是首先解码内部映射的设备。对该范围的非SMM模式处理器访问被认为是如上所述的视频缓冲区。处理器始终正向解码内部映射的设备,即IGD和PCI-Express。对映射到PCI Express或DMI接口的区域的后续解码取决于传统VGA配置位(VGA使能和MDAP)。
该区域也就是VBIOS存放地址!!!!!!!!!!!!!!!!

此区域也是SMM空间的默认值。



Compatible SMRAM Address Range (A_0000h-B_FFFFh) :
可兼容的SMRAM地址空间。当启用兼容SMM空间时,SMM模式处理器在000A_0000h000B_FFFFh访问此范围路由到物理系统DRAM。如果未将IGD作为VGA设备使能,则不允许使用PCI Express和DMI发起的周期来启用SMM空间,并将其视为视频缓冲区。DMI启动的写周期将尝试作为对支持VGA的PCIe端口的对等写周期。

Monochrome Adapter (MDA) Range (B_0000h-B_7FFFh) :
单色适配器(MDA)传统支持需要在系统中具有第二个图形控制器(单色)的能力。在标准VGA范围内的访问被转发到IGD,PCI-Express或DMI接口(取决于配置位)。由于单色适配器可以映射到任何这些设备,因此处理器必须解码MDA范围(000B_0000h000B_7FFFh)中的周期,并转发到IGD,PCI-Express或DMI接口。此功能由VGA转向位和传统配置位(MDAP位)控制。除了存储器范围B0000h到B7FFFh之外,处理器解码3B4h,3B5h,3B8h,3B9h,3BAh和3BFh的I / O周期,并将它们转发到IGD,PCI-Express和/或DMI接口。


Expansion Area (C_0000h-D_FFFFh) :
128K扩展区:这个部分被分为了8个16KB的空间,并且每一个空间都有四种读写状态,分别是read only ,write only ,read/write,disable。


Extended System BIOS Area (E_0000h-E_FFFFh) :
扩展系统BIOS:64KB被分成了4个16KB的部分,每一个部分都有自己独立的读写状态,这个区间被映射到了主存(main DRAM)上或者DMI接口上。注意,当这个区间被用作RAM/ROM时,是不能被重映射到任何地方的。


System BIOS Area (F_0000h-F_FFFFh):
系统BIOS:64KB空间,可以配置读写状态,通过操控读写状态,IMC能“shadoe”BIOS到main DRAM。当状态设置disable,这一段不会被重映射。

“shadow”BIOS:因为BIOS使用的ROM比我们使用的普通内存RAM要慢很多,所以人们就想出在启动后把BIOS的ROM里面的信息拷贝到我们插的内存条(RAM)里来,提高读取速度,而在RAM里的这些BIOS的信息就叫做BIOS影子内存。


2.2   Main Memory Address Range (1 MB - TOLUD)


ISA Hole (15 MB-16 MB) 
15m到16m空间是可选启用的ISA孔。数据表处理器配置寄存器/视频加速器最初使用这个孔。它也用于客户团队对其某些测试卡的验证。15MB -16MB窗口没有固有的BIOS请求。


TSEG:顶段内存,大小一般为1M/2M/8M。当启用SMM时,系统可用的最大内存量等于物理DRAM的量减去TSEG寄存器中固定为1 MB,2 MB或8 MB的值。



2.3 PCI* Memory Address Range (TOLUD - 4 GB) 


TOLUD->4GB,这一段空间通常会映射到DMI接口空间。


APIC Configuration Space (FEC0_0000h-FECF_FFFFh) 
这一段区间是为APIC配置所保留的,IO APIC被用来与IO APIC中断控制器进行通讯工作


HSEG (FEDA_0000h-FEDB_FFFFh) 
这个可操作区间也被命名为High SMM Memory space,它提供给SMM Memory 一个重映射窗口,在SMM mode下,这个区间会被映射000A000h->000BFFFFh上。非SMM mode时,这个区间会被认定是无效的,并且会被立即终止。


High BIOS Area 
4G空间最顶端的2M (FFE0_0000h -FFFF_FFFFh)内存是为High BIOS保留的。A20是这一段内存的人口,开机之后CPU就会从High BIOS开始执行。



2.4 Main Memory Address Space (4 GB to TOUUD) 
目前,处理器支持36bit寻址。最大支持的 main memory size 达到了8G。当main memory size接近4G或者更大的话,则会在在TOLUD到4G范围内出现重复占用,为避免实际物理内存浪费,则出现REMAP技术。
TOM:Top of Memory 


TOUUD:Top of Upper Usable Dram 


TOLUD:Top of Low Usable DRAM 


REMAPBASE:Remap Base Address Register 


REMAPLIMIT:Remap Limit Address Register 





TOLUD





以上相关截图全部来自INTEL BAYTRAIL DATASHEET!!!!!!!!!!!


Programming Model
1.确定TOM
2.确定MMIO的分配
3.确定TOLUD
4.确定GFX stolen 基值
5.确定GFX GTT stolen基值
6.确定TSEG基值
7.确定重映射的起始地址
8.确定TOUUD

关于重映射不同的情况:
1、实际物理内存远小于4G


实际物理内存:2G
MMIO:1G
重映射内存大小:0G
                TOM:2G
TOUUD:2G
TOLUD:2G
RECLAIMBASE:default
RECLAIMLIMIT:default


2.实际物理内存约等于4G
这种情况下,需要被重映射的空间是TOLUD->TOM,映射到
RECLAIMBASE与RECLAIMLIMIT寄存器所指的位置之间。


实际物理内存:3G
MMIO:2G
重映射内存大小:1G
TOM:3G
TOUUD:5G
TOLUD:3G
RECLAIMBASE:4G
RECLAIMLIMIT:5G


3. MMIO配置实例
关于code:关于MMIO大小分配







这几段code截图来自AMI code关于MMIO配置部分,通过参数的修改实现MMIO大小的变化配置,C code详细代码这儿不做说明。

Thankks for your reading。

  • 10
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值