Chinaunix

标题: 关于内核页表映射到896M地址空间的问题 [打印本页]

作者: 通用寄存器    时间: 2006-02-21 18:25
标题: 关于内核页表映射到896M地址空间的问题
小弟刚开始看ULK2,看到关于内核页表映射过程中,从3G开始到4G-128M的空间都映射到从物理地址0开始到内存结束处为止的物理页面上,那是不是说所有的物理内存都被内核页表映射了?而且是连续映射的?那小于3G地址的虚存怎么映射呢?各位大虾指点一下啊!
作者: 通用寄存器    时间: 2006-02-21 21:01
是不是可以这样理解呢:从0xc0000000到0xffffffff-128M的内核空间确实是映射到0到896M的物理空间上,而且是通过特殊地初始化页表后进行的线性映射,但是物理内存被映射后不一定被分配,如果没有被内核分配,则可以由用户进程分配,该页同时被内核与用户映射,是这样的吗?请大虾指点啊!
作者: leonashirley    时间: 2006-02-21 22:27
linux中的分页机制,用户空间和内核空间都是同样遵循的。

kernel space 中有它自己的页表,它并不一开始就映射满896MB,
而是指它最大寻址范围为896MB,当然这是在不支持大内存的情况下才能这样说。

只不过作为逻辑上的地址,kernel space是不可换出的。
作者: 通用寄存器    时间: 2006-02-21 23:05
原帖由 leonashirley 于 2006-2-21 22:27 发表
linux中的分页机制,用户空间和内核空间都是同样遵循的。

kernel space 中有它自己的页表,它并不一开始就映射满896MB,
而是指它最大寻址范围为896MB,当然这是在不支持大内存的情况下才能这样说。

只不过 ...


如果系统物理内存只有512M,内核应该是把3G到3G+512M的虚存空间映射到这512M的物理内存上吧,内核虽然映射了512M的物理内存但是不一定给虚存页面分配了物理页帧啊,没有分配的页帧也可以分配给用户进程啊,内核空间没有分配也就不存在换出吧?我是这样理解的,欢迎各位大虾指正~呵呵
作者: mq110    时间: 2006-02-22 09:10
>>内核空间没有分配也就不存在换出吧?

这句不对.
作者: 通用寄存器    时间: 2006-02-22 16:32
原帖由 mq110 于 2006-2-22 09:10 发表
>>内核空间没有分配也就不存在换出吧?

这句不对.


那应该怎样解释呢?其他理解对不对呢?
作者: mq110    时间: 2006-02-22 16:48
原帖由 leonashirley 于 2006-2-21 22:27 发表
linux中的分页机制,用户空间和内核空间都是同样遵循的。

kernel space 中有它自己的页表,它并不一开始就映射满896MB,
而是指它最大寻址范围为896MB,当然这是在不支持大内存的情况下才能这样说。

只不过 ...


我觉得leonashirley兄说的挺对的.

我也是这么理解的.

内核空间的页是不会被换出的. 只要这个页框被内核空间占用.

>>内核空间没有分配也就不存在换出吧?

这句话,我没明白.
作者: 通用寄存器    时间: 2006-02-22 17:03
原帖由 mq110 于 2006-2-22 16:48 发表


我觉得leonashirley兄说的挺对的.

我也是这么理解的.

内核空间的页是不会被换出的. 只要这个页框被内核空间占用.

>>内核空间没有分配也就不存在换出吧?

这句话,我没明白.


leonashirley兄讲到kernel space并不一开始就映射满896MB,我看ULK2我的理解是如果物理内存小于896M,则内核空间会映射到物理内存结束的地方,比如512M物理内存,则讲内核空间的3G到3G+512M线性映射到物理内存上,只不过并不是为这512M的虚存空间都实际分配了物理页帧。

关于换出的问题,我是看思一克斑竹写的 linux大海观潮:内存. 交换 中有一段话,引用一下:
>>*)在linux中什么样的内存能被交换?有的说:用户内存会,内核的内存一定不会被交换。也就是说“The memory in the Kernel/Kernel Module will never be swapped-out”。或者精确点说,内核固定影射的内存不会被交换。上述论断是不正确的。事实上,比如机器物理内存小于896M情况下,被交换的页都是KENREL固定影射的物理页。没有其它的页(这里说的交换不是广义的,而是指与交换文件/分区的交换)。
作者: 思一克    时间: 2006-02-22 17:19
没有分配的页不会被换出。换出的目的就是要保存现有主人的内容。没有分配就没有主人。
作者: mq110    时间: 2006-02-22 17:20
kernel space 的页也会被换出? 不对吧.
作者: 思一克    时间: 2006-02-22 17:25
比如你机器是512M,那么从0xc0000000的512M内存都在KERNEL的固定影射之下,并且都在KERNEL的控制之下(时刻)。其中的页是要被换出的。注意是内容换出,物理页本身是换不出的(内存条插在那里,除非带电拔出---哈)
换出后做其它用。
作者: mq110    时间: 2006-02-22 17:27
原帖由 思一克 于 2006-2-22 17:25 发表
比如你机器是512M,那么从0xc0000000的512M内存都在KERNEL的固定影射之下,并且都在KERNEL的控制之下(时刻)。其中的页是要被换出的。注意是内容换出,物理页本身是换不出的(内存条插在那里,除非带电拔出---哈 ...


恩.明白了.多谢思兄.
作者: ruf    时间: 2006-02-22 18:11
用kmalloc()分配的内存不可能被swapout,但是vmalloc()的内存是可以swapout的,所以如果需要分配大尺寸的内存空间,需要vmalloc()+set_page(reserved).
作者: richardhesidu    时间: 2006-02-22 19:08
我觉得lz有几个概念没有搞清楚。建议lz好好理解一下 物理地址,总线地址,用户虚拟地址,内核逻辑地址,内核虚拟地址的概念。
作者: 通用寄存器    时间: 2006-02-22 19:40
原帖由 richardhesidu 于 2006-2-22 19:08 发表
我觉得lz有几个概念没有搞清楚。建议lz好好理解一下 物理地址,总线地址,用户虚拟地址,内核逻辑地址,内核虚拟地址的概念。


我主要是想问3G到4G的内核空间映射到物理地址上的情况,这是不是应该是按线性方式映射的呢,1G到3G的用户空间又怎么映射到物理空间上的呢
作者: richardhesidu    时间: 2006-02-23 11:38
原帖由 通用寄存器 于 2006-2-21 18:25 发表
小弟刚开始看ULK2,看到关于内核页表映射过程中,从3G开始到4G-128M的空间都映射到从物理地址0开始到内存结束处为止的物理页面上,那是不是说所有的物理内存都被内核页表映射了?而且是连续映射的?那小于3G地址的 ...


第一个回答是肯定的。linux的内存管理是基于页的,如果没有被页映射,怎么访问地到。而且是连续映射的。linux内核通过页->内存仓库->内存区->内存结点这些数据结构来管理内存。用户态的内存映射是通过sys_brk()和sys_mmap()系统调用进行的。
作者: richardhesidu    时间: 2006-02-23 11:40
原帖由 通用寄存器 于 2006-2-21 21:01 发表
是不是可以这样理解呢:从0xc0000000到0xffffffff-128M的内核空间确实是映射到0到896M的物理空间上,而且是通过特殊地初始化页表后进行的线性映射,但是物理内存被映射后不一定被分配,如果没有被内核分配,则可 ...


用户进程没有权力分配内存页,必须通过系统调用申请。
作者: 通用寄存器    时间: 2006-02-23 16:57
原帖由 richardhesidu 于 2006-2-23 11:38 发表


第一个回答是肯定的。linux的内存管理是基于页的,如果没有被页映射,怎么访问地到。而且是连续映射的。linux内核通过页->内存仓库->内存区->内存结点这些数据结构来管理内存。用户态的内存映射是通 ...



问题是物理内存是被3G到4G-128M的虚存空间映射的,0-3G虚存空间怎么映射呢?
作者: richardhesidu    时间: 2006-02-23 19:22
原帖由 通用寄存器 于 2006-2-23 16:57 发表



问题是物理内存是被3G到4G-128M的虚存空间映射的,0-3G虚存空间怎么映射呢?


0-3G是用户空间,进程通过sys_brk()和sys_mmap()系统调用为自己的地址空间映射内存。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2