发新话题
打印

内核页表映射问题

内核页表映射问题

  GPR提问:陈老师,您好!我在学习立翻译的ULK2时,看到关于内核页表映射过程中,从3G开始到4G-128M的空间都映射到从物理地址0开始到内存结束处为止的物理页面上,那是不是说所有的物理内存都被内核页表映射了?而且是连续映射的?那小于3G地址的虚存怎么映射呢?是不是可以这样理解呢:从0xc0000000到0xffffffff-128M的内核空间确实是映射到0到896M的物理空间上,而且是通过特殊地初始化页表后进行的线性映射,但是物理内存被映射后不一定被分配,如果没有被内核分配,则可以由用户进程分配,该页同时被内核与用户映射,是这样的吗?盼解答!
来自www.kerneltravel.net
storm earth fire hear my call you are too late my brother will not die in vain 叛逆善良
陈老师回复:你理解的没错,的确是所有的物理内存都会被内核页表在系统启动时刻进行映射——除非是高端内存(有关这个内容你可查看经验交流中的“小论内存映射”一文——,而且是连续的进行了映射。
另外映射不代表分配,分配是在需要时刻才进行的,对于内核于用户进程同时可映射一个物理地址的说法,你也理解正确。 同样一段物理内存是可以建立多个映射关系,系统初始化话时通常使用内核页表会映射所有的物理内存,因此内核可访问所有的物理内存;而进程请求内存时(动态或静态的),内核会分配一块内存,然后用进程自己的页表进行映射,使得其被映射到进程的虚拟地址空间(0x000000000-0xc0000000),这样进程才可访问该内存区。——当然内核也可以访问这里,因为内核页表映射了所有内存。
storm earth fire hear my call you are too late my brother will not die in vain 叛逆善良
不是进程才拥有页表吗?存在内核页表,是不是说内核是一个进程?内核页表映射了3G-4G,是不是内核中的代码不能引用小于3G的地址?内核如何访问高于1G的物理内存?是谁在使用内核页表,是内核线程?是用户进程中执行了陷入内核态的函数或系统调用?或是中断?望回复,谢谢
存在内核页表(swapper_pg_dir)并不是说内核就是一个进程,进程的概念是针对用户程序的。
内核中的代码要访问小于3G的地址,必然要从内核态跳到用户态,那执行的就不是内核中的代码了。
内核不能直接对1GB以上的RAM进行寻址,必须启用PAE才行。
谁在使用内核页表,你说的对,凡是执行内核中的代码时使用。不过内核中的虚地址转换到物理地址是一种简单的线性关系。
透析真谛,似拨云穿雾;共享智慧,如春风沐浴
http://www.kerneltravel.net
谢谢陈老师的回答,令我对内核态和用户态的内存管理有了比较深刻的认识。
还有一个问题不是很明白,就是用户进程中执行了内核函数,或是在用户进程执行过程中产生了中断。在这些函数或中断程序返回之前会调用进程调度函数,进程调度函数会选择别的进程执行。那么上述的内核函数或中断程序的RET指令或IRET指令会在何时执行
如果中断发生在内核空间,则执行完中断处理程序后直接返回到中断曾发生的地方。IRET指令就是将EIP、CS及EFLAGS寄存器内容从栈中弹出,并将控制权返回到发生中断的地方。但是,如果中断发生在用户空间,中断的返回过程稍微麻烦,在从中断返回之前,还要环顾四周,看看内核还有什么事要做,如果有,继续做,直到内核无事可做才返回。
透析真谛,似拨云穿雾;共享智慧,如春风沐浴
http://www.kerneltravel.net
发新话题