虚拟地址与物理地址 -神贴

来源:互联网 发布:淘宝云客服多久结工资 编辑:程序博客网 时间:2024/06/05 02:45

在网上看到一神贴,感觉把物理地址和虚拟地址,说的很不错。好好领悟。

提问:

各位高手大家好!

        前一段时间一直在研究wince5.0中的地址映射问题。我的说法如下,请大家帮忙看一下有没有什么问题,一起讨论一下。

      假设要写一个设备驱动程序,在datasheet上面可以看见一些地址,就是物理地址,而且针对不同的寄存器,它的地址是不同的。那么这个地址是如何映射系统中的虚拟地址空间的呢?在操作系统中,只有把外设的地址空间从0x8000 0000 以上(即内核空间)中的cache和uncache部分都做了映射,对于uncache部分通常是用来做驱动部分的。那么设备的地址映射到操作系统中以后,如果要读写寄存器的话,系统就是对这个虚拟地址进行操作了。如果是这样的话,对于任何一个设备,要做驱动的话,是不是就可以认为是在对一块内存进行操作,都需要完成物理地址到虚拟地址的映射,来完成读写。但是对于不同的地址线以及cs片选线,可以算出一个物理地址,而这个物理地址是一个范围,大小就是设备空间(或者寄存器空间)大小。也可以说说成是:算出来的线就是基地址,datasheet上的偏移量就是寄存器的地址。

     例如:64M大小 Nor FLASH的地址总线与CPU的地址总线连接,假设是接低位地址线的(高位地址线悬空)话,就可以得到地址空间为0xFF00 0000——0XFFFF FFFF,那么系统假设在Nor FLASH上启动的话,对应的地址就是片上的0地址开始,执行第一条指令,但是物理地址就应该是0xFF00 0000,在完成bootloader以后,这个地址就会被映射到0x8000 0000 ,以此类推。

    以上是小弟的一点见解,请大家指点,互相提高。

答:

针对你的题目,我做个简单解释。在WinCE中操作硬件都是通过虚拟地址实现的,现在的32bitCPU的物理地址空间是4GB,无论是CPU的片选还是CPU内部的寄存器都会统一分配在这4GB的物理地址空间之内。所以,在WinCE中,CPU的4GB物理地址空间将被影射为512MB的虚拟地址空间,这个工作在BSP中由OemAddressTable来完成。有两套虚拟地址空间,一套是Cached,一套是Uncached,都做什么用,我不多说了,你在网上搜索一下,有文章介绍。

 我想你应该好好看看你的CPU的datasheet,一般寄存器会有一个物理地址空间,不同的片选也会对应不同的物理地址空间,但是所有这些物理地址空间都在同一个4GB的物理地址空间之内。如果你在WinCE中想操作寄存器或者访问片选所接的外设就要定义虚拟地址/物理地址影射关系以及大小,这个通过BSP的OEMAddressTable实现,当然也可以通过WinCE的函数动态影射。

 再说一下你的例子,NOR Flash接在片选0上,要看你的片选0对应的地址空间,一般都是0地址,至于他被影射到哪个虚拟地址空间,也要看OEMAddressTable中的定义。关于OEMAddressTable,网上也有文章,你可以搜索一下。

0 0
原创粉丝点击