32位系统的物理地址空间?
最近做驱动时发现物理地址经常会被板卡占掉一些,如PCI Express的配置空间用内核映射方式的话会占用256M的地址空间,而板子为了完成某些寄存器和驱动来交互,也会占用一些地址空间(通过BAR申请)。
这种情况下如果系统装有4G的物理内存,在32位系统中是如何管理的?因为地址空间有些会被板卡占用。
另外,物理内存总是占用从0开始的物理地址吗,能不能把物理内存中的不同部分映射到不地的物理地址段上?
[ 本帖最后由 Cyberman.Wu 于 2008-7-12 17:32 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
踢一下,没人站出来?
内存映射的是虚拟地址,这个和物理地址是两码事。如果你有4G的物理内存,那实际上是不可能所有都映射到进程的地址空间的,应为896M以上的就属于高端内存了。建议LZ看看内存映射方面的资料,ULK上面有讲到,物理内存的使用布局等等,这个应该有帮助你理解这个问题。
ULK是啥资料?不同进程在进程空间占用不同的物理页面,而共享所有内核空间,这个我早就知道。现在关心的不是虚拟地址,而是物理地址,32bit能否支持4GB物理内存?因为在总路上外设会占用一些物理地址空间,那4GB的物理内存如何支持?如我的显卡就占了256M的地址空间(通过BAR0申请的),那么在32bit物理寻址时从CPU上向总线发起访问这个范围内的内存操作时,实际上是北桥上视别出它在PCIe的地址空间之后直接生成一个PCIe的报文发到PCIe总线上了。这种情况下如何访问4GB的物理内存,通过某种复用机制?好像没看到FSB有这种机制吧,再说如果有这种机制硬件没办法视别出软件想访问什么啊,需要软件做出支持才行。
也就是说,我的问题是在纯32位物理寻址的情况下(即不考虑PAE)CPU能否支持4GB物理内存,和虚拟内存没有半点关系;打开PAE也只是物理内存寻址增加了,每个进程的虚拟内存还是4GB的。
[ 本帖最后由 Cyberman.Wu 于 2008-8-12 16:52 编辑 ]
理論上可以支持4GB的物理內存,但實際上高端內存(大于896MB)是不可能永久映射的到虛擬地阯空間的。
没怎么明白是什么意思,我想讨论的是物理内存寻址,不要老是扯到虚拟内存空间好不好?如果用VxWorks,根本就不存在虚拟空间了。
不明白你到底要解决什么问题。32位肯定是可以支持4GB的物理地址,我的意思是一旦涉及到操作系统,就离不开讨论虚拟地址——进程的地址空间也指的的是虚拟地址。关于Vxworks,我了解不多,但是他也存在地址映射(你说不存在虚拟空间,这个结论我表示质疑)。我认为,一个真正意义的操作系统,不可能没有虚拟地址到物理地址映射这一层关系。所以,我一开始就连带说到了虚拟地址。
32位完全是支持4GB的物理内存的:如果不使用操作系统,你完全可以当作一个平板物理空间来访问。但一旦有了操作系统,(物理内存在896M—4G的情况),并不把RAM全部映射到内核地址空间,Linux在初始化阶段把一个具有896MB的RAM窗口映射到内核线性地址空间。如果一个程序需要对现有RAM其余部分寻址,那就必须把其他的线性地址间隔映射到所需的RAM,也就是說高与896MB的页框,并不映射到线性地址空间的第4个GB。这是一个永久映射和动态映射的问题。
你所说的那些设备占用的物理内存的问题,有可能是映射到了第4个GB——是被永久映射的物理地址,也有可能是独立寻址的;当然,如果你这里說占用了,那就应该是永久映射到第4个GB了。可以看看这个图,是linux2.6前3MB的映射情况:
[ 本帖最后由 dreamice 于 2008-8-13 10:19 编辑 ]
我想清楚的是用32位的地址总线能否支持4GB物理内存,就这么简单,这个讨论并不涉及操作系统。此时如果向总线发出一个地址访问内存的话,并且装了4GB的RAM,能复用被外设占用的那一部分物理地址空间吗?我在想如果用线性寻址的话对于PC要在32位系统中支持4GB物理内存是不是一定要用PAE才行?当然用段寄存器也许有另外的解决办法?对于x86我并不熟悉,以前一直用PowerPC,所以现在搞不清楚。
什么叫“真正的操作系统”并没有什么绝对的定义吧,VxWorks取决于CPU,在PowerPC上确实可以映射,但一般都是一对一映射的。许多嵌入式系统的CPU根本就没有MMU,但许多还是有操作系统的,而且比通用操作系统的种类多多了。
好象也不是绝对都映射到3GB以上的物理内存吧,传统的ISA设备应该不支持32bit地址的。独立寻址指什么,是指I/O空间吗?以前没怎么深入接触过这些通用操作系统,而计算机体系结构也不是非常了解,物理内存总应该在连续的物理地址空间上吧,就算是用了PAE,它和设备占用的物理地址空间又是如何分配的?
其实目前也不是有什么具体的问题要解决,只是想对系统有更明确的了解。