当前位置: 代码迷 >> 驱动开发 >> 物理地址如何映射大容量的内存
  详细解决方案

物理地址如何映射大容量的内存

热度:94   发布时间:2016-04-28 11:01:18.0
物理地址怎么映射大容量的内存?
一块SOC芯片,它的物理地址分配中有一大部分留给了内存,一部分留给了寄存器等,是这样的么?
如果内存很大,那么怎么实现有限的物理地址映射大容量内存的呢?这部分地址其实是对应内存控制器的么?而具体的实现是靠控制器完成?

------解决方案--------------------
一块SOC芯片,它的物理地址分配中有一大部分留给了内存,一部分留给了寄存器等,是这样的么?

是这样的。
通常,CPU内部会集成很多的模块,操作这些模块就需要寄存器。可能的实现是,将这些模块的寄存器都集中在一起放在一块连续的地址空间中。

对于内存,它也有相应的控制器模块。
该模块就会定义内存的一些属性,比如 片选CS是哪一个,base address 是多少,size 是多少。 具体的时序信息等等。

如果内存很大,那么怎么实现有限的物理地址映射大容量内存的呢?这部分地址其实是对应内存控制器的么?而具体的实现是靠控制器完成?

内存很大? 
如果大过了SOC分配给内存的地址空间,那肯定不行的了。可能有一些内存的空间会牺牲掉。
内存的大小选型,一定要满足 SOC分配给内存的地址空间,否则,即使很大,也是浪费的。

内存控制器是一片起控制作用的寄存器区域。

内存的地址空间和内存控制器的地址空间,是两码事,是独立开的两个区域。
------解决方案--------------------
一一对应的,
具体对应方式,就看你启用的是 page 访问方式,还是 bta 块地址翻译方式,
可能还存在其他的虚拟地址到物理地址的映射方式
------解决方案--------------------
1、通常我们的操作系统都是32bit的,也就是4G最大的有效地址;
2、在外设(Local Bus,UART和SPI寄存器等)占掉一部分后,按照一一
对应的地址翻译,怎么都到不了4G的内存;
3、通常的做法是采用滑窗的方案,即根据访问,动态配置有效地址和物理地址
之间的映射;
4、当然,前天是你的CPU至少得支持大于32-bit的总线,比如36bit、64bit等