linux memory management

先立个Flag,给自己一个Todo :)

务必先读 gorman的书 Understanding The Linux Virtual Memory Manager
务必先读 gorman的书 Understanding The Linux Virtual Memory Manager
务必先读 gorman的书 Understanding The Linux Virtual Memory Manager

https://landley.net/writing/memory-faq.txt
https://slideshare.net/AdrianHuang/presentations
https://hammertux.github.io/slab-allcator
https://blog.csdn.net/mrwangwang/article/details/38709813
https://inst.eecs.berkeley.edu/~cs162/sp20/static/lectures/13.pdf
https://linuxplumbersconf.org/event/2/contributions/65/attachments/15/171/slides-expanded.pdf
https://manybutfinite.com/post/how-the-kernel-manages-your-memory/
https://www.cse.iitb.ac.in/~mythili/teaching/cs347_autumn2016/notes/07-memory.pdf

名词解释

high memory & low memory

high memory和low memory可以说是针对物理内存的概念,在以前的32位处理器中,kernel
把virtual address space划分成2部分,3G用户空间和1G kernel空间,其中1G的kernel空
间又分成两部分:

  • low memory: 低地址的896MB,总是映射到kernel address space。
  • high memory: 对于32位系统,1G以外的地址不是全部被映射的,这部分就叫high memory。

为了kernel能访问更多的内存,比如64GB(36位),kernel引入了PAE(page address extension)的概念,
并预留了kernel address space高地址的104MB用做映射1G以外的内存。但在64位系统中,
high memory也是可以被映射的,但是由于kernel对物理地址连续内存的偏好,以及使用
限制(vmalloc指定GFP_HIGHMEM分配),high memory还是用的不多。 在用户态中,用户地址
是需要显式映射的,通常high memory用于用户态。

参考:
How Linux kernel decide to which memory zone to use
Kernel addresses – concept of low and high memory
kernel memory

Kernel addresses – concept of low and high memory

zone

kernel使用Zone来管理physical address space range.一般有zone_dma, zone_normal和
zone_highmem,X86上zone的布局可以参考下图:

x86 zone info

在ARM64中,没有zone_highmem区域,具体代码参考zone_type

zone info

参考:
Linux内存管理zone_sizes_init
linux内核内存管理

linux virtual address

linux中virtual address可以有三类:

  • Kernel Logical Address: 通过kmalloc分配,和物理地址有一个fixed offset和fixed mapping, 不能被swapped out,和上文的low memory映射。
  • Kernel Virtual Address: 也叫vmalloc区域,主要用于映射非连续的物理内存,通过vmalloc分配;以及mmio访问外设,通过ioremap和kmap分配。
  • User Virtual Address:用户态虚拟地址,在page_offset之下,每个进程都有自己的映射,一般通过mmu映射,只有使用到的ram才会比映射,一般非连续,可以不swapped out,也可以被move。

kernel logic address

参考:
Virtual Memory and Linux

  • physmap: physical direct mapping, 用于申请物理地址连续内存,对应上文的kernel logic address。
  • vmalloc: dynamic meory region,用于申请虚拟地址连续内存,对应上文的kernel virtual address。
  • vmemmap: virtual memory map,专门开辟的一个映射,包含physical page frames的metadata,优化pfn_to_page和page_to_pfn的效率

具体代码VMEMMAP_START
arm64上映射布局可以参考下图,具体文档arm64 memory.rst

arm64 kernel memory mapping

由于内核已经把virtual memory layout功能给去掉,从4.15内核里面把这个代码加回来之后,
在arm64 virt qemu的机器上,内核的打印如下:

arm64 kernel memory mapping2

综述

mem alloc hierarchy

mem alloc

内存碎片演进简史

Linux Kernel vs. Memory Fragmentation

参考:

linux mm scope

mm api scope

参考:

知道是不会有人点的,但万一有人呢:)