当前位置: 技术问答>linux和unix
求教:关于内核物理地址和虚拟地址的问题
来源: 互联网 发布时间:2016-02-06
本文导语: 内核里的程序可以直接访问物理地址吗?我知道用户程序拥有的是虚拟的空间不能访问物理地址,现在我学驱动程序,看到书上有个程序,为了测试低1M内的物理地址,是这样写的 int addr=0x0A.....; char *p=(char *)addr; 然后它就...
内核里的程序可以直接访问物理地址吗?我知道用户程序拥有的是虚拟的空间不能访问物理地址,现在我学驱动程序,看到书上有个程序,为了测试低1M内的物理地址,是这样写的
int addr=0x0A.....;
char *p=(char *)addr;
然后它就用这样的方法就访问到了物理地址,我知道如果写的是用户空间里的程序,这样是绝对不能访问物理地址的,因为给变量p的地址是虚拟地址,物理地址要靠MMU给用户程序分配,但是书上这么写是不是表明,只要是编译加载到内核里的模块,都是直接访问物理地址的,而不是虚拟地址?
int addr=0x0A.....;
char *p=(char *)addr;
然后它就用这样的方法就访问到了物理地址,我知道如果写的是用户空间里的程序,这样是绝对不能访问物理地址的,因为给变量p的地址是虚拟地址,物理地址要靠MMU给用户程序分配,但是书上这么写是不是表明,只要是编译加载到内核里的模块,都是直接访问物理地址的,而不是虚拟地址?
|
内核也不能直接访问物理地址.但因为内核的虚拟地址和物理地址之间只是一个差值0xc0000000的区别,所以从物理地址求虚拟地址或从虚拟地址求物理地址很容易,+-这个差就行了.宏phy_to_virt就是这样从物理地址得到虚拟地址的.你在程序应该可以找到这个宏.