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