浅谈Linux内核页面换入换出

本文详细探讨了Linux内核中的页面换入换出机制,包括内存页面分类、用户页面的换入与换出流程,以及针对不同类型的页面如何处理。重点关注了文件映射和匿名映射在换入换出过程中的区别,分析了Linux内核如何避免内存抖动并优化内存管理。
摘要由CSDN通过智能技术生成

【推荐阅读】

浅谈linux 内核网络 sk_buff 之克隆与复制

深入linux内核架构--进程&线程

了解Docker 依赖的linux内核技术

怎么在Windows下使用Makefile文件

浅析linux内核网络协议栈--linux bridge

0x00内存页面分类与换入换出规则

内存页面分为用户页面和内核页面。

用户页面有以下几种:

1、普通的用户空间页面,包括进程的代码段、数据段、堆栈段、以及动态分配的存储堆。

2、通过系统调用mmap()映射到用户空间的已打开文件的内容。

这些页面既涉及分配、使用和回收,也涉及页面的换出/换入。

内核页面有以下几种:

1、kmalloc分配用作某些临时性的数据结构,如vma_area_struct。

2、内核通过alloc_page分配,如每个进程的系统堆栈所在的两个页面。

这些页面不涉及页面的换出/换入,一旦使用完毕,就可以释放、回收。

3、文件系统相关的结构体如dentry、node

这些页面不涉及页面的换出/换入,但即使使用完毕,其内容仍有保存的价值,只要条件允许,就将这些页面养起来,可以提高以后的操作效率

4、内核代码和内核中全局量所占的内存页面

这些页面既不需要分配,也不会被释放

0x01用户页面的换入

对于内核来说,只有两种用户页面,一种是文件映射,一种是匿名映射。前一种和swap没有关系,直接换出到硬盘上文件。后者会交换到swap。

1、文件映射--->换出到硬盘

2、匿名映射--->换出到swap

既然涉及到换出,我们还是先说下换入,换入也由换出定义的这两种页面为导向。

1、可执行文件(文件映射还包含直接映射硬盘上某个文件,不限于可执行文件)的换入

	error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
				elf_prot, elf_flags, 0);

elf_map会进一步调用mmap将可执行文件的映射到内存,这种映射属于文件映射。

我们先看下映射到内存虚拟地址的情况:

0x00601000-0x00602000这个虚拟地址空间映射为可写,我们再来看看这个区域到底放着什么信息?

里面是.data段、.bss段一些可写的段。

那么就涉及到一个问题,既然是文件映射,当发生页面短缺时,是要换出到硬盘的。我们可以想象下总不可能每执行一次文件,我硬盘的可执行文件的数据就变化一下吧?那么linux内核是怎么处理的呢?我们放在后面再说。

首先理清一个思路,mmap这个系统调用,只是申请一片虚拟内存地址,并没有实际到把硬盘中的数据读到内存,并建立映射(建立页目录表、页表)。

当访问到对应的虚拟地址空间时,触发缺页中断do_no_page,从硬盘中把数据读到内存,并建立映射。

if (!pte_present(entry)) {//页面不在内存中  
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值