LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 954|回复: 1

内核中的内存管理的问题

[复制链接]
发表于 2004-7-21 10:51:05 | 显示全部楼层 |阅读模式
在内核中,有一个这样的宏
#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)宏,好象没有经过页式映射。还有,上面提到的

系统空间都有相同的页面映射

到底是什么意思(这也说明内核也有页面映射),是不是一定的线性地址就有一定的物理地址?

请高手指教!
发表于 2004-7-25 17:36:00 | 显示全部楼层

回复: 内核中的内存管理的问题

在内核中,有一个这样的宏
#define __pa(x) (...)

我想问一下,linux采用的是页式内存管理的,那么线性地址是不是要经过页式映射才能得到物理地址呢? 怎么凭一个宏就简单的得到了物理地址了,那么程序员是不是很容易的从线性地址就知道它在内存中的位置,从而可以修改它?

是不是这是在内核中,是系统空间,不是用户空间,程序员要访问会被拒绝?

这个宏使用于内核态,不能用于用户程序。3级保护环怎么能改变0级保护环的内核资源呢?
其实分页机制对于系统程序员是透明的,所有的内核调用都必须经由调用门来实现。
还有 ,在 情景分析一书中 ,有这么一段

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.不管是用户态空间还是内核态空间,对于用户进程都是透明的。
2.在4GB的线性虚拟内存空间中,3GB~4GB是内核态空间是所有进程共享的,所以对于所有进程,它都有同样的页面映射。注意,它不能被随意访问,用户进程只能通过内核调用(0x80软中断)来访问它。
3.在PCB(进程控制块)中有一个mm_struct成员,用来描述进程的地址空间,而这个PCB是和内核堆栈区放在一起的。
4.进程线性地址空间的映射是通过do_mmap()内核函数转换所得的。

ps:除非你是内核开发者,否则无须过多考虑这个问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表