Chinaunix
标题:
swapper_pg_dir问题
[打印本页]
作者:
embeddedlwp
时间:
2011-11-09 10:36
标题:
swapper_pg_dir问题
310static void __init pagetable_init (void)
311{
312 unsigned long vaddr;
313 pgd_t *pgd_base = swapper_pg_dir;
314
。。。。。。。。。。。。。。。。。
346#ifdef CONFIG_X86_PAE
347 /*
348 * Add low memory identity-mappings - SMP needs it when
349 * starting up on an AP from real-mode. In the non-PAE
350 * case we already have these mappings through head.S.
351 * All user-space mappings are explicitly cleared after
352 * SMP startup.
353 */
354 pgd_base[0] = pgd_base[USER_PTRS_PER_PGD];
355#endif
356}
复制代码
在pagetable_init函数中有这么一部分,在临时内核页表建立的过程中,swapper_pg_dir存放的是页全局目录,应该是0~4G
在最终内核页表建立的过程中仍然使用swapper_pg_dir变量,此时应该存放的是master kernel page directory,但是这段代码说
如果CONFIG_X86_PAGE,才把swapper_pg_dir设置为存放3G~4G部分的页全局目录的地址,那么如果不开PAE,RAM大小在896MB~4GB,
swapper_pg_dir存放的是0~4GB的页全局目录的地址,而不是master kernel page directory?
作者:
embeddedlwp
时间:
2011-11-10 09:02
顶!
作者:
flikelinux
时间:
2011-11-10 09:09
初始化时swapper_pg_dir存放的是3G--3G+896MB的物理映射,其他的都填0.
作者:
embeddedlwp
时间:
2011-11-10 09:26
回复
3#
flikelinux
你这个“初始化”是指什么时候,是临时内核映射吗?如果是这个时候,那么swapper_pg_dir存放的页全局目录的地址,从0~4G
我问的地方是建立最终内核页表的时候,看上边那个程序:
pgd_t *pgd_base = swapper_pg_dir;
复制代码
此时pgd_base仍然是指向0~4G的那个页全局目录,下边这句:
pgd_base[0] = pgd_base[USER_PTRS_PER_PGD];
复制代码
写着只有开PAE才表示3G~4G的master kernel page directory,否则岂不是swapper_pg_dir还是0~4G
作者:
chishanmingshen
时间:
2011-11-10 21:39
是zap_low_mappings()吧
作者:
_nosay
时间:
2017-08-09 10:11
回复
1#
embeddedlwp
我不是来回答问题的,我是来请教的:1. 3G+896MB~4G虚拟地址属于内核空间,并且与物理页面的映射关系可变,它们在目录表的索引范围是992~1023;
2. 任何一个进程修改3G+896MB~4G区间的映射时,为了让各位进程都知道,所以同步到swapper_pg_dir,又不想马上就“惊动”所有进程,所以只同步到swapper_pg_dir。
疑问:
假设3G~3G+4MB这块虚拟地址还没有与物理页面映射。
这样假设的话,进程A、B的目录表,以及swapper_pg_dir,992处的目录项是不是都为0?如果进程A建立了3G~3G+4MB中某个页面的映射,则992处的目录项指向一个新建的页表,并复制到swapper_pg_dir的992下标处,进程B访问这个页面时,由于相应的目录项还为0,就会在缺页异常函数从swapper_pg_dir中“同步”过来。
但如果反过来,假设进程A、B的目录表,以及swapper_pg_dir,992处的目录项都不为0,进程A断开了某个页面的映射而导致992目录项为0,并复制给swapper_pg_dir,那么进程B的映射表里,还存在已被进程A断开的映射关系,如何产生缺页异常呢?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2