内核中的内存管理的问题
在内核中,有一个这样的宏#define __pa(x)(...)
我想问一下,linux采用的是页式内存管理的,那么线性地址是不是要经过页式映射才能得到物理地址呢? 怎么凭一个宏就简单的得到了物理地址了,那么程序员是不是很容易的从线性地址就知道它在内存中的位置,从而可以修改它?
是不是这是在内核中,是系统空间,不是用户空间,程序员要访问会被拒绝?
还有 ,在 情景分析一书中 ,有这么一段
static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)
{
......
asm volatile("movl %0, %%cr3": :"r" (__pa(next->pgd)))
......
}
我们以前曾用这行代码说明__pa()的用途,这里将下一个进程的页面目录pgd的物理地址装入寄存器%%cr3,页即CR3。细心的读者可能会问:这样,在这一行以前和以后CR3的值不一样,也就是使用不同的页面目录,不会使程序的执行不能连续吗?答案是,这是在内核中。不管什么进程,一旦进入内核就进入了系统空间,都有相同的页面映射,所以不会有问题。
我要问的是:
上面的嵌入的汇编代码也是用到了__pa(x)宏,好象没有经过页式映射。还有,上面提到的
系统空间都有相同的页面映射
到底是什么意思(这也说明内核也有页面映射),是不是一定的线性地址就有一定的物理地址?
请高手指教! 怎么回事,怎么没有人回帖啊?
页:
[1]