学习linux内核-- 内存,看一篇就够了(多图)

本文详细介绍了Linux内核的内存管理,包括内存的总体布局、地址转换、页表机制、内核页表与进程页表的关系、伙伴系统和slab的内存分配,以及内存的回收和页表的反向映射。通过实例解析了内存地址的映射过程,阐述了内存分配工具如malloc、vmalloc和kmalloc的工作原理,并提到了内存分析工具valgrind和相关内存分析命令。

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

内存模块

1 linux内存总体布局:内存分成用户态和内核态

4G进程地址空间解析

内核地址空间

进程地址空间
 

2 地址转换和页表

2.1 地址转换

虚拟内存是指程序使用的逻辑地址。每个进程4G。所有进程共享物理内存4G,所以逻辑地址和物理地址不是一一对应,需要地址转换.

页表由3部分组成:页目录,页面,页内偏移
32bit只有3级 0 -11位:页内偏移OFFSET 12-21位:页面表偏移PT(PTE 页表项.指向一张具体的物理内存页) 22-31位:页面目录偏移PGD
寻址过程如下:
1)操作系统从寄存器CR3获得当前页面目录指针(基地址);
2)基地址+页面目录偏移->页面表指针(基地址);
3)页面表指针+页面表偏移->内存页基址;
4)内存页基址+页内偏移->具体物理内存单元。
页号=逻辑地址/页面大小;页面偏移量=逻辑地址%页面大小 。
页目录保存页表项的地址,页表项保存物理地址,最后1项保存4k页内偏移。
进程页表长这样子:

举例说明地址映射:比如要访问线性地址0xBFC0 4FFE(1byte),2进制形式

1).mmu先取线性地址高10位(31-22)=767,x4=3068=0xBFC,+cr3=0x3800 0bfc,即页目录项在内存的地址,此地址的内容0x392f f000即页表首地址(页对齐最后12位清0)
2).mmu取线性地址下面10位数(21-12)=4,x4=16=0x10,+0x392f f000=0x392f f010,即页表项在内存的地址,此地址的内容0x3080 4000即物理页面的首地址(页对齐最后12位清0)
3).mmu取线性地址最后12位数(11-0)=4094=0xffe作为低12位,0x3080 4000的前20位作为高20位,组成一个新的32位数0x3080 4ffe即线性地址0xBFC0 4FFE对应的物理地址

2.2 内核页表和进程页表的区别和联系?

进程页表访问:虚拟内存与物理内存的对应。 内核页表:建立物理内存和disk的对应.address_space。
mm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值