Chinaunix

标题: 关于多级页表的疑问 [打印本页]

作者: vestige    时间: 2008-03-31 22:06
标题: 关于多级页表的疑问
ULK上说:
使用二级分页模式的目的在于减少每个进程页表所需的RAM数量,如果使用一级页表
将需要2的20次方个表项来表示每个进程的页表。

但我认为使用二级分页模式不仍然需要2的20次方的表项来表示每个进程的页表吗?(4GB)
2的10次方(页目录)*2的10次方(页表)

然后ULK上又说:
二级分页模式通过只为进程实际使用的那些虚拟内存区请求页表来减少页表使用的内存。

我想问的是一级页表不同样可以通过只为进程实际使用的那些虚拟内存区来请求页表吗?
作者: vestige    时间: 2008-03-31 22:09
我又想了想,会不会是因为要维护一个2的20次方
的数组比较麻烦?
作者: xiaozhao73    时间: 2008-04-01 01:41
二级页表并不用全分配的,除非你用全了4G 地址空间,因为它可以分配 pde(4K)+ number of pte, not all process uses 1024*pte?

one level page table you have to do full allocate or hash to allocate less space.

power pc is using hash.
作者: vestige    时间: 2008-04-01 11:28
谢谢楼上的回复,是不是说如果二级页表,就先为pde分配1024个空间,然后
按需分配pte,但是如果使用一级分页,就需要直接分配2的20次方空间大小的
页表?
作者: dengcainiao    时间: 2008-04-01 11:48
页目录空间是必须要分配的,页目录指向的页表如果那段线性地址没有使用可以不分配,达到节省内存的效果
作者: zx_wing    时间: 2008-04-01 12:51
。。。。。。。

[ 本帖最后由 zx_wing 于 2008-4-1 16:34 编辑 ]
作者: dengcainiao    时间: 2008-04-01 14:32
LINUX2.6.11.1开始是4级页表PGD,PUD,PMD,PT.32位的X86平台实际只有PGD,PT两项有效。

[ 本帖最后由 dengcainiao 于 2008-4-1 16:14 编辑 ]
作者: zx_wing    时间: 2008-04-01 15:31
原帖由 bluesky_jxc 于 2008-4-1 13:58 发表



32位的x86就两级页表,linux为了支持多平台,所以做了三级,在x86下有一级映射为空。ULK上看的

。。。。。。。。。。。。

[ 本帖最后由 zx_wing 于 2008-4-1 16:34 编辑 ]
作者: dengcainiao    时间: 2008-04-01 16:21
更正一下我之前的说法。在2.6.11.1以后,Linux使用4级页表机制。针对32位X86平台在打开PAE以后应该用的是3级页表,否则是两级,其中PUD,PMD两级均被跳过

在Pgtable.h中有如下代码
/*
* The Linux x86 paging architecture is 'compile-time dual-mode', it
* implements both the traditional 2-level x86 page tables and the
* newer 3-level PAE-mode page tables.
*/
#ifdef CONFIG_X86_PAE
# include <asm/pgtable-3level-defs.h>
# define PMD_SIZE        (1UL << PMD_SHIFT)
# define PMD_MASK        (~(PMD_SIZE-1))
#else
# include <asm/pgtable-2level-defs.h>
#endif


[ 本帖最后由 dengcainiao 于 2008-4-1 16:25 编辑 ]
作者: dengcainiao    时间: 2008-04-01 16:22
再附上pgtable-2level-defs.h的内容:
#ifndef _I386_PGTABLE_2LEVEL_DEFS_H
#define _I386_PGTABLE_2LEVEL_DEFS_H

/*
* traditional i386 two-level paging structure:
*/

#define PGDIR_SHIFT        22
#define PTRS_PER_PGD        1024

/*
* the i386 is two-level, so we don't really have any
* PMD directory physically.
*/

#define PTRS_PER_PTE        1024

#endif /* _I386_PGTABLE_2LEVEL_DEFS_H */
作者: dxcnjupt    时间: 2008-04-01 16:26
ia32可以用2级,也可以用3级,看cr寄存器的设置.
一般是开启36bit物理内存模式的时候用3级页表

见intel开发者文档第三卷第三章
-------------
刚翻了下资料就.........LS回帖真快

[ 本帖最后由 dxcnjupt 于 2008-4-1 16:28 编辑 ]
作者: zx_wing    时间: 2008-04-01 16:34
原帖由 dxcnjupt 于 2008-4-1 16:26 发表
ia32可以用2级,也可以用3级,看cr寄存器的设置.
一般是开启36bit物理内存模式的时候用3级页表

见intel开发者文档第三卷第三章
-------------
刚翻了下资料就.........LS回帖真快

汗啊,我一直以为x86最低必须从3级开始,原来可以是两级。
受教了,多谢LS几位
作者: silentfish    时间: 2008-04-01 20:46
标题: 赞同5楼
X86上不开启PAE,使用4K的页表:

如果页表只有一级,那么2^20个页表要线性排列,即在连续的空间上排列,即使某项为空也要留下页表项的位置
如果有两级页表,那么第一级的空间仍然要分配,但第二级的页表可以以1024(4K/4)项为单位不连续分布,这样的话如果页表使用的空间基本与进程使用的空间呈线性,如果进程使用的内存空间小,就可以大大减少页表所占空间。
最后,如果进程使用所有的线性地址空间,用二级页表的空间比用一级页表的空间大0.1%左右。

我写的废话多了点...
作者: vestige    时间: 2008-04-01 22:29
标题: 回复 #14 silentfish 的帖子
为什么用二级页表的空间比用一级页表的空间大?
不是都是2的20次方个表项吗?
作者: vestige    时间: 2008-04-01 22:30
标题: 回复 #15 vestige 的帖子
不会是因为1024个pde吧……
1024/1024*1024刚好等于0.1%
作者: 自由建客    时间: 2008-04-02 16:28
计算机组成原理,不是微机原理
作者: sudy    时间: 2008-04-05 11:45
原帖由 vestige 于 2008-4-1 22:30 发表
不会是因为1024个pde吧……
1024/1024*1024刚好等于0.1%

你得到了她:)
就是多了1024个pde




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