先立个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
zone
kernel使用Zone来管理physical address space range.一般有zone_dma, zone_normal和
zone_highmem,X86上zone的布局可以参考下图:
在ARM64中,没有zone_highmem区域,具体代码参考zone_type。
参考:
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。
- 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
由于内核已经把virtual memory layout功能给去掉,从4.15内核里面把这个代码加回来之后,
在arm64 virt qemu的机器上,内核的打印如下:
综述
内存碎片演进简史
Linux Kernel vs. Memory Fragmentation
参考:
linux mm scope
参考:
- [Arm64 Linux Kernel vs. Memory FragmentationARM64 Kernel Image Mapping的变化
- KASLR-MT: Kernel Address Space Layout Randomization for Multi-Tenant cloud systems
- AArch64 Kernel Page Tables
- Tour de Linux memory management
- W4118 OPERATING SYSTEMS
- Minimizing struct page overhead
- struct page, the Linux physical page frame data structure
- linux内存管理