页面的换入

本文详细介绍了i386 CPU如何处理页面映射失败的情况,包括页面表项和目录项中P标志位的作用,以及如何通过查找缓存和磁盘来恢复缺失的页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在i386CPU将一个线性地址映射成物理地址的过程中如果页面该地址的映射已经建立,但是发现相应页面表项或目录项中的P(present)标志位为0;表示相应的物理页面不在内存中。只有P标志位为0就都认为页面映射是失败的,其他字段没有意义。

-- do_page_fault() > handle_mm_fault( ) > handle_pte_fault( )

 handle_pte_fault( )中首先检查P的标志位,<1>如果为0,再检查表项是否为空,即全0;如果为空那么就说明映射尚未建立。<0>不为空则说明页面已经映射,在交换设备上。通过do_swap_page( )从交换设备上换入这个页面。

-- do_page_fault() > handle_mm_fault( ) > handle_pte_fault( )  > do_swap_page( )

处理页面异常时,首先要看看相应的内存页面是否还留在swapper_space上换入换出队列中尚未释放,<1>如果是,则先调用lookup_swap_cache()。<0>如果没找到那就说明已经释放了,内容只能在盘上。那就通过read_swap_cache()分配一个内存页面。在此之前会先调用swapin_readahead( )(从磁盘上读时会进行预读,通常链入了活跃页面队列)。无论swapin_readahead( )还是read_swap_cache()都会将gfp_mask的_ _GFP_WAIT置为1,当分配不到内存页面时,让内核调度其他进程先运行(其他进程可能换出空间),再次分配页面很有可能成功,如果失败就do_swap_page()失败了返回-1。

-- do_page_fault() > handle_mm_fault( ) > handle_pte_fault( )  > do_swap_page( )  > read_swap_cache( )

这个函数中调用了两次lookup_swap_cache( ),第一次从swapper_space寻找一次,(节省一次从设备上读,防止同一页面在内存上有两个副本);第二次防止当前进程在等待期间读入了页面,所以再检查一遍。需要从交换设备中读入就通过add_to_swap_cache()将新分配的物理页面(它的page结构)挂入swapper_space队列以及active_list中。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值