1330569Sgordon.. SPDX-License-Identifier: GPL-2.0 2267843Sdelphij 3330569Sgordon:Original: Documentation/mm/memory-model.rst 4330569Sgordon 5330569Sgordon:������: 6330569Sgordon 7330569Sgordon ��������� Yanteng Si <siyanteng@loongson.cn> 8330569Sgordon 9330569Sgordon:������: 10330569Sgordon 11330569Sgordon 12330569Sgordon============ 13330569Sgordon������������������ 14330569Sgordon============ 15330569Sgordon 16330569Sgordon������������������������������������������������������������������������������������������������������������0��� 17330569Sgordon���������������������������������������������������������������������������������������������CPU��������������� 18330569Sgordon������������������������������������������������������������������������������������������������NUMA��������� 19330569Sgordon���������������������������������CPU��� 20330569Sgordon 21330569SgordonLinux���������������������������������������������������������������������FLATMEM���SPARSEM������ 22330569Sgordon��������������������������������������������������������������������������������������������������������������� 23��������������������� 24 25������������������������������������������������������������������ `struct page` ������������������ 26��������������� 27 28���������������������������������������������������PFN��������������� `struct page` ������������ 29������������������������������ 30 31������������������������������ :c:func:`pfn_to_page` ��� :c:func:`page_to_pfn` 32������������������������PFN��� `struct page` ��������������������������� 33 34FLATMEM 35======= 36 37���������������������������FLATMEM���������������������������NUMA������������������������������������ 38��������������� 39 40���FLATMEM������������������������������������ `mem_map` ��������������������������������������� 41������������������������������ `mem_map` ��������������������������������������������� `struct page` 42��������������������������������� 43 44������������ `mem_map` ������������������������������������������������free_area_init()��������� 45������������������memblock_free_all()��������������������������������������������������������� 46��������������������������������������� 47 48��������������������������� `mem_map` ��������������������������������������������������������������������� 49������������ :c:func:`pfn_valid` ��������������������� `mem_map` ��������������� 50 51������FLATMEM���PFN��� `struct page` ������������������������������ `PFN - ARCH_PFN_OFFSET` 52��� `mem_map` ������������������������ 53 54`ARCH_PFN_OFFSET` ������������������������������������������0��������������������������������� 55 56SPARSEMEM 57========= 58 59SPARSEMEM���Linux������������������������������������������������������������������������������������ 60������������������������������������������������������������������������������������������������������������ 61������������ 62 63SPARSEMEM���������������������������������������������������������������������mem_section������ 64��������������������� `section_mem_map` ��������������������������������������� `struct page` 65���������������������������������������������������������magic��������������������������������������������� 66��������������������������� `SECTION_SIZE_BITS` ��� `MAX_PHYSMEM_BITS` ������ 67������������������������������������������������SPARSEMEM��������������������� `MAX_PHYSMEM_BITS` 68������������������������������������������������������������ `SECTION_SIZE_BITS` ������������ 69������������ 70 71������������������������ `NR_MEM_SECTIONS` ������������ 72 73.. math:: 74 75 NR\_MEM\_SECTIONS = 2 ^ {(MAX\_PHYSMEM\_BITS - SECTION\_SIZE\_BITS)} 76 77`mem_section` ������������������������������ `mem_sections` ������������������������������������ 78������������������������ `CONFIG_SPARSEM_EXTREME` ������������������������: 79 80* ��� `CONFIG_SPARSEMEM_EXTREME` ��������������� `mem_sections` ������������������������ 81 `NR_MEM_SECTIONS` ��������������������������� `mem_section` ��������� 82* ��� `CONFIG_SPARSEMEM_EXTREME` ��������������� `mem_sections` ������������������������ 83 ��������������������� `PAGE_SIZE` ��� `mem_section` ������������������������������������������������ 84 ������������ 85 86������������������������������sparse_init()��������������������������������������� 87 88������SPARSEMEM������������������������������PFN������������������ `struct page` --"classic sparse"��� 89 "sparse vmemmap"������������������������������������������ `CONFIG_SPARSEMEM_VMEMMAP` ��� 90 ������������ 91 92Classic sparse���page->flags���������������������������������������������PFN������������������������������ 93���������������������������������PFN������������������������������ 94 95Sparse vmemmapvmemmap������������������������������������������pfn_to_page���page_to_pfn��� 96������������������������ `struct page *vmemmap` ������������������������������������ `struct page` 97���������������PFN������������������������������`struct page` ��� `vmemmap` ������������������������PFN��� 98 99������������vmemmap������������������������������������������������������������������������������������������������������ 100������ `vmemmap`��������������������������������������������� :c:func:`vmemmap_populate` ��������� 101������������������������������������������������������������������������������������vmemmap��������������������������������� 102������������������������������������������������ :c:func:`vmemmap_populate_basepages`��� 103 104������������������������������������������������������������ `struct page` ��������������������������������������� 105���������������������������������vmem_altmap������������������������������������������������������������ 106vmemmap_populate()���vmemmap_populate()������������������ `vmem_altmap` ��� 107:c:func:`vmemmap_alloc_block_buf` ��������������������������������������������������������� 108 109ZONE_DEVICE 110=========== 111`ZONE_DEVICE` ��������������� `SPARSEM_VMEMMAP` ������������������������������������������������ 112��������� `struct page` `mem_map` ��������� `ZONE_DEVICE` ��� "������" ��������������� 113��������������������������������������������������������������������������������������������������������������������������� 114��������������������������������������������������������� `ZONE_DEVICE` ��������� :c:func:`devm_memremap_pages` ��� 115������������pfns��������������������������������������������� :c:func:`pfn_to_page`��� 116:c:func:`page_to_pfn`, ������ :c:func:`get_user_pages` ������������������������ 117���������������������������1��������������������������������������������������������������� `struct list_head lru` 118���������������������������������������������������������������/��������������������������������� 119 120������ `SPARSEMEM` ��������������������������������������������������������������������������������� 121`ZONE_DEVICE` ��������������������������������������� `mem_map` ��������� `ZONE_DEVICE` 122������������������������������������������������������������������sysfs���������������api������������������������ 123������������������������������������������������������������������������������������������������������������ 124:c:func:`arch_add_memory` ���������������������������������������������������������2MB������ 125:c:func:`devm_memremap_pages` ������������������������������������ 126 127`ZONE_DEVICE` ������������: 128 129* pmem: ������DAX������������������������������������������I/O��������������� 130 131* hmm: ��� `->page_fault()` ��� `->page_free()` ������������������ `ZONE_DEVICE` ��� 132 ���������������������������������������������������������������������������������������GPU���������������Documentation/mm/hmm.rst��� 133 134* p2pdma: ������ `struct page` ���������������PCI/E������������������peer��������������������������� 135 ������DMA��������������������������������� 136