日期:2014-05-16  浏览次数:20593 次

求教:关于内核物理地址和虚拟地址的问题
内核里的程序可以直接访问物理地址吗?我知道用户程序拥有的是虚拟的空间不能访问物理地址,现在我学驱动程序,看到书上有个程序,为了测试低1M内的物理地址,是这样写的
int   addr=0x0A.....;
char   *p=(char   *)addr;

然后它就用这样的方法就访问到了物理地址,我知道如果写的是用户空间里的程序,这样是绝对不能访问物理地址的,因为给变量p的地址是虚拟地址,物理地址要靠MMU给用户程序分配,但是书上这么写是不是表明,只要是编译加载到内核里的模块,都是直接访问物理地址的,而不是虚拟地址?

------解决方案--------------------
内核也不能直接访问物理地址.但因为内核的虚拟地址和物理地址之间只是一个差值0xc0000000的区别,所以从物理地址求虚拟地址或从虚拟地址求物理地址很容易,+-这个差就行了.宏phy_to_virt就是这样从物理地址得到虚拟地址的.你在程序应该可以找到这个宏.