Linux内存管理

虚拟内存和物理内存

物理内存就是内存块的物理地址集合,来访问已经位置固定的内存区域。虚拟内存是为了解决物理内存地址暴露给进程的一种机制,通过虚拟内存映射来访问物理内存,从而达到保护物理内存的安全以及提高访问内存的效率。虚拟内存支持程序访问比物理内存大得多的内存空间,这个功能依靠磁盘+RAM来实现,因为磁盘空间相对于RAM来说价格更低廉,存储空间大,所以虚拟内存并不是真正意义的内存,而是一种虚拟的映射关系。

页,页框,页面

虚拟内存块通常被分割成页,页的大小通常在32位的系统下被分成4KB,页是内存管理的基本单元。而物理内存通常被划分成用于保护这些页的区,这些区成为页面。当进程访问一个地址时,地址所在的页被载入内存中。如果一个地址并未被访问过,则该页并未加载到内存中,则第一次对其访问要从磁盘中进行请求,就会产生一个缺页。当发生缺页的时候,内核必须选择一个页面,将其内容写回到磁盘中,使用刚刚访问的页的内容来填充它。将页在内存和磁盘之间调入调出的机制称之为分页机制,分页包括虚拟内存地址到物理内存地址的转换。
页面是存放页的基本内存单元,只要进程请求内存,内核便会请求一个页面给他。

SLAB分配器

页是内存管理的基本单元,但是进程通常申请是以字节为单位请求内存,为了支持小块内存请求,内核特别实现了slab分配器来管理内存。它为了减少内存分配、初始化、销毁、释放等等,会维护一个一个经常使用的缓冲区。

虚拟内存到物理内存的映射

当用户空间的程序被载入到内存后,就拥有了自己的线性地址空间,线性地址空间被划分成各个的段。下图就是虚拟内存的不同分区图:在这里插入图片描述

页表

程序内存的有效管理是通过虚拟地址来完成,但是处理器只会识别物理地址和操作物理地址。所以虚拟地址和对应的物理地址之间的管理需要内核中的页表来维护。页表来对内存中页面的走向进行记录。在内核运行的整个周期内,页表都存放在内存中。Linux总共有3级的页表分页机制,来确保64位体系有足够的空间维护虚拟地址到物理地址的转换。

逻辑地址到物理地址的转换

首先,逻辑地址是通过一个段标识符和一个偏移量组成,偏移量指明了段的起始地址和实地地址的偏移量。线性地址也就是之前说的虚拟地址,大小是4g,是一个32位的无符号整数。分段单元来完成逻辑地址到线性地址的转换
在这里插入图片描述
在配置好页表之后,进程执行时,通过查找页表,就能找到每页内存中的物理块号,从而实现到物理地址的转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值