内存管理之page数据结构

1.page数据结构

page数据结构可以分为四个部分:
在这里插入图片描述

mapping成员:

mapping表示页面所指向的地址空间,内核中有两个不同的地址空间:

  • 文件映射页面(在读取文件时,将文件内容数据与存储介质区关联起来)
  • 匿名映射(指向匿名页面地址空间数据结构anon_vma

2._refount的应用

_refount表示内核中引用该页面的次数:

  • >0表示页面已被分配且正在被使用,暂时不释放。
  • =0表示页面空闲或即将被释放。

使用内核中get_page使_refount加1,put_page使_refount减1。

_refount用于跟踪页面的使用情况:

  1. 初始状态下,空闲页面的_refount是0。

  2. alloc_page成功分配页面后,_refount应该为0,然后设置页面的_refount为1。

  3. 加入LRU,页面被kswapd使用,_refount会加1。
    在这里插入图片描述

  4. 映射到其他进程PTE,_refount加1。
    在这里插入图片描述

  5. 页面private成员指向私有数据。

    • 对于PG_swapable的页面,__add_to_swap_cache()函数会增加_refount
    • 对于PG_private的页面,buffer_migrate_page()函数会增加_refount

3._mapcount的应用

_mapcount表示页面被多少个PTE映射,有多个用户进程地址空间同时映射到一个物理页面的情况,_mapcount主要用在RMAP系统中。

  • _mapcount为-1,表示没有PTE映射到页面

  • _mapcount为0,表示只有父进程映射到页面。匿名页面刚分配时,_mapcount初始化为0
    在这里插入图片描述

  • _mapcount大于0,表示除了父进程还有其他进程映射到这个页面
    在这里插入图片描述

4.页锁

page数据结构成员PG_locked为页锁,lock_page()函数由于申请页锁,如果页锁被其他进程占用,就会睡眠等待。
在这里插入图片描述

5.mapping的应用

mapping指向页面对应存储设备的地址空间:

  • 匿名页面:mapping指向VMAanon_vma数据结构。
  • 交换高速缓存页面:mapping指向交换分区的swapper_spaces
  • 文件映射页面,mapping指向文件所属的address_space数据结构,包含文件所属介质的相关信息。

6.相关接口函数

  1. page_mapping()函数

    page_mapping()返回page数据结构中mapping成员指向的地址空间address_space数据结构

    • 匿名页面:anon_vma数据结构指向RMAP机制用的数据结构,没有指向对应的存储介质,所以page_mapping()返回NULL
    • 交换高速缓存页面:通过swap_address_space()宏返回分区的address_space
    • 文件映射页面:返回时把低二位清零,低二位用于确定该页面是匿名页面还是KSM页面。
    • slab分配器页面:返回NULL
  2. page_mappde()函数

    page_mappde()判断页面是否有映射到用户PTE,判断_mapcount是否大于或等于0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值