Linux 内存寻址:从虚拟地址到物理内存的实
Linux 内存寻址,就是虚拟地址怎么一步步变成真实内存。
分段基本是走过场:C 语言里的指针其实是虚拟地址。现代 Linux 把段基址全设成 0。所以逻辑地址几乎原样变成了虚拟地址。真正管用的是分页。
分页靠页表做翻译:CPU 里的 MMU 拿着页表查物理位置。为了查得快,旁边还备了个 TLB 缓存。每个进程都觉得自己独占了整个内存。其实是因为切换进程时,页表也跟着换了。
物理内存由内核统筹:内核用伙伴系统管理整块内存。用小物件则走 slab 缓存。用户态的 malloc 不直接找内核。小内存自己攒着,大块才去申请。
malloc 不等于真拿到内存:Linux 会先给虚拟地址。等你真去碰这块内存时,才临时分配物理页。所以程序刚启动时,常驻内存(RSS)远小于虚拟内存(VIRT)。
排查问题别被 VIRT 骗了:看内存占用得盯紧 RSS。但 RSS 也会算上共享库,不能直接加总。想看有没有泄漏,就多采样几次看 RSS 涨没涨。要是频繁卡顿,就去查查主缺页次数。
原文Linux 内存寻址:从虚拟地址到物理内存的实战拆解