zhaojt 发表于 2005-11-8 17:19:25

怎样恢复一个页面表项指向交换分区的内存页面映射

问题一20051108已解决
A
用户空间一个页面放入不活跃脏队列(或者不活跃干净队列)后,此时进程的页面表中指向该页面的表项改为指向交换分区中的备份页面。

问题是:
当进程再次访问到这个页面表项时,如何从不活跃队列中恢复映射??

我的理解是:
进程的页表项已指向交换分区上的一个页面了,而交换分区中的页面描述项中又没有反指向内存的成员以表明我是内存的哪个页面的备份,进程只能根据页表项找到交换分区中的备份页,而找不到已存在内存中的不活跃队列中的页面,只有再重新分配一个内存页面,然后将交换分区的页面COPY到新分的页面中。但是事实应该不是这样的,因为页面放到不活跃队列中,只是缓冲一下,是为了能够在再次需要访问时还能够还把它从队列中取回来用,



B
浙大毛德操的LINUX内核情景分析P118,这一页说:
页面空闲时,PAGE结构中的COUNT成员的值为0,分配时设为1,此后每增加一个“用户”,如建立或恢复一个映射时,就使COUNT加1。这样,COUNT为2时,就说明刚断开的映射已经是物理页面的最后一个映射,既然最后的映射已断开,这个页面当然是不活跃的了。

我不明白的是:
COUNT为2时,为什么说最后的映射已断开呢?

我的理解是:
我认为COUNT为2时,应该还有一个映射存在,因为页面刚分配出来而没有建立映射时,COUNT为1,而只要COUNT大于1,就说明有映射存在。

问题二20061207
1>
swap_entry_t 中offset占24位,type占7位,是把bit0除去后,从bit1-bit7,但是在include/asm-i386/pgtable.h 中定义#define SWP_TYPE(x) ((x).val>>1)&0x3f) ,我的分析是0x3f是6位,前面的define实际上只取了6位,如果要取val中的7位(从bit1-bit7),则应该把上面的0x3f变成0x7f。
2>
printk("VM: Bad swap entry %08lx\n", entry.val);
%08|x 是什么格式?

zhaojt 发表于 2005-11-8 22:06:45

A搞清了,
通过lookup_swap_cache(struct swp_entry_tentry)能找到内存中对应于entry的页面的地址,page结构中的next_hash和pprev_hash成员是用来描述这种关系的,建立这种关系的函数是add_page_to_hash_queue(struct *page,struct page **p),而双星指针p是通过函数page_hash(struct address_space *swapper_space,struct swp_entry_t entry)获得的。

zhaojt 发表于 2005-11-8 22:18:20

C
当一个页面空闲时,通过page结构中的list成员链入到管理区的free_area队列数组中,可是free_area所能容纳的页面数量是有限的,十一个队列(MAXORDER=10时),每个队列中容纳的页面数量分别为1,2,4,8,,,,1024。
当这些页面队列都是满的时候,又有一个页面空闲了,那么这个空闲的页面放到哪里去呢???

xhs1115 发表于 2005-11-30 11:10:02

A
通过宏swp_entry_to_pte就可以找到内存中对应于entry的页面的地址,不知道对不对,不过我觉得有点问题;

C
理解错误,并不是每个队列中容纳的页面数量分别为1,2,4,8,,,,1024,而是每个队列链接的是不同大小的页面,如第一个队列节点指向的页面大小为1,第二个队列节点指向的页面大小为2;
页: [1]
查看完整版本: 怎样恢复一个页面表项指向交换分区的内存页面映射