SlideShare a Scribd company logo
1 of 123
Download to read offline
1
Ch. 3: Memory Management
CL614854
2.6.35.11
Bob.Fu
2
Memory Management
OS
大學上完 OS
對 memory 的理解如上
3
*. 一個小 job
*. 由 job 自行簡易管理
*. memory 不須劃分 pfn
*. 可存取任意位置
*. 數個小 job
*. memory 集中管理
*. memory 必須劃分 pfn
*. bitmap
*. 紀錄 free/reserve
*. 數個 job
*. memory 集中管理
*. memory 必須劃分 pfn
*. struct page
*. 紀錄複雜 status
page
page
page
page
kernel 初期
bootmem allocator
kernel 後期
buddy system
4
RAM
bootmem
allocator
struct
page
array
pageset
buddy system
per-cpu
area
5
pageset
per-cpu
area
kmem cache
buddy system
other
place
in
kernel
page
page page
pages
pages
bytes
6
6M
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
1M
2M
512M
512M
1. start_kernel 初始狀況 (MMU, mapping)
0xC0008000, kernel(init, text, data)
0xC0004000, page table
7
Physical Address Virtual Address
0x00000000
512M
512M
*. mapping 目標存在 : CPU 可正常存取
*. mapping 多個目標 : ( 私以為 ) 不可能
mapping
destination
mapping
source
*. 多個 mapping 目標 overlap: 可以
*. mapping 目標不完全存在 :
目標存在部份 , CPU 可正常存取
目標不存在部份 , CPU 不可正常存取
*. mapping 根本沒建 : CPU 不可正常存取
*. mapping 目標不存在 : CPU 不可正常存取
這些 mapping 都紀錄在 page table 裡
結論 : 目標存在 , mapping 有建 -->( 原則上 ) 正常存取
8
6M
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
1M
2M
512M
512M
1. start_kernel 初始狀況 (MMU, mapping)
1
CPUMMU
TLB
2
3
4
1. 當 CPU 對某 VA 作存取
2. 實際上會被 MMU 作 VA->PA 的轉換
3. TLB 是 MMU 的 cache, 快速查表
4. TLB 沒紀錄就去 page table 查表
5. 得到 PA 後 , 去實際所在作存取
*. 以上 , CPU 本身不知道
*. 建立 mapping 就是填值 , 讓 MMU 可以查表
9
6M
Physical Address Virtual Address
1M
2M
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
0xC0008000, kernel(init, text, data)
0xC0000100, boot args
0xC0004000, page table
10
6M
Physical Address Virtual Address
1M
2M
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
0xC0008000, kernel(init, text, data)
0xC0000100, boot args
0xC0004000, page table
sboot
*. 硬體初始化
*. 把 uboot 載入 memory
*. 交接給 uboot
uboot
*. 把 boot args 存在某位置
*. 把 kernel 載入 memory
*. 交接給 kernel
kernel
*. kernel 自行解壓縮 & 執行
*. 從某位置讀出 boot args
*. ......
11
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
12
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
0xC0510000, bitmap( 幾乎緊貼著 kernel)
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
13
free
free
page table
kernel
bitmap
reserve
( 示意圖 )
unit: page
reserve
*. 計算 bitmap 所需空間
*. 全部設 reserve
*. 根據 kernel 可管理部份
*. 部份設 free
*. 三塊已使用區域
*. 設 reserve
reserve
free
reserve
15
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
bootmem_data
node_min_pfn
node_low_pfn
node_bootmem_map
0xC0510000, bitmap
資料結構 ( 含 bitmap) + 演算法
--> bootmem allocator
kernel 一開始的 memory 管理
接下來如果需要 memory
bootmem allocator
會負責找合適的位置 & 回傳
page table
kernel
bitmap
16
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
0xC0000000, section info
0xC0510000, bitmap
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
17
CPU CPU CPU
NUMA
(non-uniform memory access)
CPU CPU
MIPS 支援 NUMA
ARM 沒支援 NUMA
UMA
(uniform memory access)
CPU
18
CPU CPU
Flat Discontiguous
UMA
(uniform memory access)
CPU
Sparse
19
page
page
page
page
page frame, ID 0
page frame, ID 0x40000
struct page array
Flat Model
0x00000000
1. 實體 memory 劃分成一堆 page frame
2. 每個 page frame 有自己的 unique ID
3. 分配一個 page frame, 建立 mem_section
3. 分配數個 page frame, 建立 struct page array
4. 每個 page frame 對應一個 struct page
5. mem_map 紀錄 struct page array 起點
( 示意圖 )
bitmap
mem_map
20
Physical Address
mem_section[2]
section_mem_map
mem_section[5]
section_mem_map
page
page
page
page
1
0
6
7
5
page
page4
3
Sparse Model
1. 實體 memory 劃分成一堆 page frame
2. 每個 page frame 有自己的 unique ID
3. 分配一個 page frame, 建立 mem_section
4. 分配數個 page frame, 建立 struct page array
5. 每個 page frame 對應一個 struct page
6. mem section 各自紀錄 struct page array 起點
struct page array
( 示意圖 )
bitmap
2
21
Physical Address
page
page
page
page
2
1
0
6
7
5
page
page4
3
struct page arraybitmap
( 示意圖 )
*. bootmem allocator 使用 bitmap
*. bootmem allocator 產生 struct pages
*. buddy system 使用 struct pages
*. RAM 不存在 , 也可能有 bitmap 對應
*. 非 kernel 管理部份 , 也可能有 page 對應
22
Physical Address Virtual Address
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
zone 0
zone 1
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
highmem boundary
23
Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
x86 case
Lowmem
(DMA+Normal)
boundary 定義在 VA
用來區分 zone
DMA
Normal
24
Physical Address Virtual Address
Highmem
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
x86 case
Normal
DMA
Lowmem
(DMA+Normal)
DMA
Normal
超過 lowmem 的部份
無法 1-to-1 mapping
屬於 highmem
25
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
Physical Address Virtual Address
0x00000000
Lowmem
(Normal)
x86 case arm case
Normal
DMA
Lowmem
(DMA+Normal)
boundary 是 CPU-specific
不同 CPU 可能不同
0x40000000
0x60000000
0xA0000000
0xC0000000
Normal
Highmem
Highmem
26
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
Physical Address Virtual Address
0x00000000
Lowmem
(Normal)
arm case
our RAM
arm case
不同的 RAM 分佈
只差在 mapping 不同
0x40000000
0x60000000
0xA0000000
0xC0000000
Normal
Lowmem
(Normal)
Normal
Normal
Highmem
Highmem
27
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
arm case
our RAM
Lowmem
(Normal)
Normal
Normal
Highmem
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
arm case
our RAM
our layout
Normal
Normal
Lowmem
(Normal)
我們沒讓 kernel 管理所有的 RAM
28
Physical Address
Normal
Normal
Highmem
Physical Address
Normal
Normal
以 zone 的角度看 RAM
Normal ZoneNormal Zone
Highmem Zone
arm case
our RAM
arm case
our RAM
our layout
29
Physical Address
Normal
Normal
Normal Zone
arm case
our RAM
our layout
Physical Address
Normal
Normal
arm case
our RAM
our layout
our zone..
Nornal MIU0 Zone
Normal Zone 因為某些需要
我們修改 zone 的區分
新增了 MIU0 Zone
31
UMA
(uniform memory access)
我們只有 1 個 node
我們有 2~3 個 zone
CPU CPU CPU
node zone
( 示意圖 )
node_zones[ZONE_NORMAL_MIU0]
zone_pgdat
zone_start_pfn
spanned_pages
present_pages
name
zone_pgdat
zone_start_pfn
spanned_pages
present_pages
name
node_zones[ZONE_NORMAL]
node_start_pfn
bdata
node_present_pages
node_spanned_pages
pg_data_t
0x9BC6
0x9D00
0x40200
"Normal_MIU0"
0x49F00
0x65E00
0x2E44
"Normal"
bootmem_data
node_min_pfn
node_low_pfn
node_bootmem_map bitmap 的位置 , in VA
0x40200
0xAFD00
contig_page_data
zone
32
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table
0xC0000000, section info
0xC051E000, struct page array
0xC0510000, bitmap
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
33
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar
0xC0000000, section info
0xC051E000, struct page array
0xC0510000, bitmap
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
34
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd
0xC0000000, section info
0xC051E000, struct page array
0xC0510000, bitmap
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
35
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
0xC0000000, section info
0xC051E000, struct page array
0xC0510000, bitmap
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
36
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
0xC0000000, section info
0xFFFF0000, vector table
0xC051E000, struct page array
0xC0510000, bitmap
0xC0009E04, vector table
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
1. 目標存在
2. mapping 有建
3. 有程式可讓執行
37
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
1
0xFFFF0000, vector table
0xC0009E04, vector table
0xC0008000, kernel(init, text, data)
*. kernel 裡有個 vector table
1. 分配一個 page frame, (PA)0x????????
2. 建立 mapping
(VA)0xFFFF0000 -> (PA)0x????????
3. 複製 vector table 到 0xFFFF0000
*. 發生 exception, CPU 會自動跳轉到對應項
Address Exception Type
0xFFFF0000 Reset
0xFFFF0004 Undefined instruction
0xFFFF0008 Software interrupt
0xFFFF000C Prefetch abort
0xFFFF0010 Data abort
0xFFFF0014 Reserved
0xFFFF0018 IRQ
0xFFFF001C FIQ
38
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC0510000, bitmap
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
39
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7 0xC0D46000, per-cpu data(for cpu1)
0xC0D36000, per-cpu data(for cpu0)
0xC0029000, per-cpu data
for cpu0
for cpu1
static
static
dynamic
+ reserve
dynamic
+ reserve
static kernel 自帶
bootmem
allocator
分配空間
40
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7 0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC0510000, bitmap
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
41
UMA
(uniform memory access)
我們只有 1 個 node
我們有 2~3 個 zone
CPU CPU CPU
node
zone
( 示意圖 )
node_zones[ZONE_NORMAL_MIU0]
zone_pgdat
zone_start_pfn
spanned_pages
present_pages
name
zone_pgdat
zone_start_pfn
spanned_pages
present_pages
name
node_zones[ZONE_NORMAL]
pg_data_t
0x9BC6
0x9D00
0x40200
"Normal_MIU0"
0x49F00
0x65E00
0x2E44
"Normal"
bootmem_data
node_min_pfn
node_low_pfn
node_bootmem_map bitmap 的位置 , in VA
0x40200
0xAFD00
contig_page_data
zonelist
_zonerefs[0]
_zonerefs[1]
zone
zone
fallback list
42
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7 0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC0510000, bitmap
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
11. 釋放 bank 之間對應的 struct page 給 bootmem
43
Physical Address
59M
page
page
page
page
page
page
page
page
page
struct page array bitmap
page page page page page page
page page page page page page
page page page page page page
page page page page page page
page frames
( 示意圖 )
46
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
vmalloc
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
11. 釋放 bank 之間對應的 struct page 給 bootmem
12. 把所有 free page & bitmap 轉給 buddy system
0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC0510000, bitmap
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init, text, data)
0xC0004000, page table
0xC0000100, boot args
51
Physical Address
59M
157M
2
5
1
0
3
4
6
7
page
section info
page
boot args
page
page table
page
kernel
page
bitmap
page
struct page array
page
vector table
page
per-cpu data
page
free
( 示意圖 )
把所有 free page frame
對應的 sturct page
轉交給 buddy system
bitmap
52
node_zones[ZONE_NORMAL_MIU0]
zone_pgdat
zone_start_pfn
spanned_pages
present_pages
name
zone_pgdat
zone_start_pfn
spanned_pages
present_pages
name
node_zones[ZONE_NORMAL]
pg_data_t
bootmem_data
node_min_pfn
node_low_pfn
node_bootmem_map
contig_page_data
zonelist
_zonerefs[0]
_zonerefs[1]
zone
zone
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
node_zones[0]
free_list[MOVABLE]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
資料結構 + 演算法
--> buddy system
53
node_zones[0]
free_list[MOVABLE]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
lru
page2
lru
page3
lru
page4
lru
page5
lru
page6
lru
page7
0
1
2
3
4
5
6
7
54
node_zones[0]
free_list[MOVABLE]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
lru
page2
lru
page3
lru
page4
lru
page5
lru
page6
lru
page7
0
1
2
3
4
5
6
7
lru
page0
55
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
lru
page3
lru
page4
lru
page5
lru
page6
lru
page7
0
1
2
3
4
5
6
7
lru
page2
free_list[MOVABLE]
lru
page2
不會合併
56
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
lru
page4
lru
page5
lru
page6
lru
page7
0
1
2
3
4
5
6
7
lru
page2
lru
page3
lru
page3
lru
page2
發現 buddy system
存在可合併對象
抓出來合併
free_list[MOVABLE]
57
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
lru
page4
lru
page5
lru
page6
lru
page7
0
1
2
3
4
5
6
7
lru
page2
lru
page3
lru
page2
lru
page3
接到更高的 order
free_list[MOVABLE]
58
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
lru
page4
lru
page5
lru
page6
lru
page7
0
1
2
3
4
5
6
7
lru
page2
lru
page3
free_list[MOVABLE]
lru
page4
lru
page5
可一次 free 多個 page
不會合併
59
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
0
1
2
3
4
5
6
7
lru
page2
lru
page3
free_list[MOVABLE]
lru
page6
lru
page7
lru
page4
lru
page5
lru
page6
lru
page7
lru
page4
lru
page5
發現 buddy system
存在可合併對象
抓出來合併
60
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
lru
page1
0
1
2
3
4
5
6
7
lru
page2
lru
page3
free_list[MOVABLE]
lru
page6
lru
page7
lru
page4
lru
page5
lru
page6
lru
page7
lru
page4
lru
page5
接到更高的 order
61
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
0
1
2
3
4
5
6
7
free_list[MOVABLE]
lru
page6
lru
page7
lru
page4
lru
page5
lru
page1
lru
page1
lru
page2
lru
page3
lru
page0
萬一此時 page1 被 free
1. 嘗試 order 0 合併
62
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
0
1
2
3
4
5
6
7
free_list[MOVABLE]
lru
page6
lru
page7
lru
page4
lru
page5
lru
page1
lru
page2
lru
page3
lru
page2
lru
page3
萬一此時 page1 被 free
1. 嘗試 order 0 合併
2. 嘗試 order 1 合併
63
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
0
1
2
3
4
5
6
7
free_list[MOVABLE]
lru
page6
lru
page7
lru
page4
lru
page5
lru
page1
lru
page2
lru
page3
lru
page6
lru
page7
lru
page4
lru
page5
萬一此時 page1 被 free
1. 嘗試 order 0 合併
2. 嘗試 order 1 合併
3. 嘗試 order 2 合併
64
node_zones[0]
free_area[0]
free_list[MOVABLE]
free_area[1]
free_list[MOVABLE]
free_area[2]
free_list[MOVABLE]
free_area[3]
free_list[MOVABLE]
free_area[4]
free_list[MOVABLE]
free_area[5]
lru
page0
0
1
2
3
4
5
6
7
free_list[MOVABLE]
lru
page6
lru
page7
lru
page4
lru
page5
lru
page1
lru
page2
lru
page3
接到更高的 order
65
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pcp
high
batch
per_cpu_pageset
lists
for zone0
0x0
pcp
high
batch
per_cpu_pageset
lists
for zone1
0x0
lru
page
*. 如果 order = 0, page --> pageset
lru
page
lru
page
66
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
lru
page
*. 如果 order = 0, page --> pageset
1. 檢查第 1 組 32 bit, 存在 reserve bit
1.1. 一次 1 個 , page --> pageset --> buddy system
pcp
high
batch
per_cpu_pageset
lists
for zone0
0x0
pcp
high
batch
per_cpu_pageset
lists
for zone1
0x0
lru
page
lru
page
67
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
*. 如果 order = 0, page --> pageset
1. 檢查第 1 組 32 bit, 存在 reserve bit
1.1. 一次 1 個 , page --> pageset --> buddy system
1.2. 第 1 組結束 , buddy system 新增 11 個 page
pcp
high
batch
per_cpu_pageset
lists
for zone0
0x0
pcp
high
batch
per_cpu_pageset
lists
for zone1
0x0
lru
page
lru
page
11
68
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
*. 如果 order = 0, page --> pageset
1. 檢查第 1 組 32 bit, 存在 reserve bit
1.1. 一次 1 個 , page --> pageset --> buddy system
1.2. 第 1 組結束 , buddy system 新增 11 個 page
2. 檢查第 2 組 32 bit, 都是 free bit
2.1. 一次 32 個 page 傳到 buddy system
pcp
high
batch
per_cpu_pageset
lists
for zone0
0x0
pcp
high
batch
per_cpu_pageset
lists
for zone1
0x0
lru
page
lru
page
11
lru
page
lru
page
32
70
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
把所有 free page frame
對應的 sturct page
轉交給 buddy system
接著轉交 bitmap 本身所佔空間
page
bitmap
( 示意圖 )bitmap
73
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
pa
lr
pa
lr
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
page
lru
35
1024
512
256
512
256
128
8
4
16
32
1
2
buddy system
能管理的 page 就是這麼多
( 初始化結束後
會再多 kernel init 所佔空間 )
此時 memroy 管理單位 : page
74
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
vmalloc
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
11. 釋放 bank 之間對應的 struct page 給 bootmem
12. 把所有 free page & bitmap 轉給 buddy system
13. 建立 kmem cache
0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init)
0xC0004000, page table
0xC0000100, boot args
0xC002C000, kernel(text, data)
75
kmem_cache
nodelists[0]
next
array[0]
1 page frame = 4096 bytes management
n 個 object
left over
切成 n 個同大小 object
幾種可能的 case
含有一堆 object 的 page
--> slab
76
slabs_partial
kmem_list3
slabs_free
slabs_full
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
entry[0x1]
entry[0x2]
entry[0x3]
free
used
指標手 托盤手
頭
77
81
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
82
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
83
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
84
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
85
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
86
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
87
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
88
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
89
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
90
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
91
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
92
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
93
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
94
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
95
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
96
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
97
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
98
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
99
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
100
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
101
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
102
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
103
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
104
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
105
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
106
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
107
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
108
負責提供”頭”負責提供”指標手”負責提供”托盤手”負責提供”其它”
109
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
110
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
111
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
112
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
113
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
114
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
115
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
116
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[2]
117
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
118
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
119
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
120
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
121
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
kmem_cache
nodelists[0]
next
array[0]
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
126
kmem_cache
nodelists[0]
next
array[0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
1. 為以下 size 產生 kmem_cache:
32, 64, 96, ..., 1K, 2K, 4K, ...1M, 2M, 4M
127
kmem_cache
nodelists[0]
next
array[0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
1. 為以下 size 產生 kmem_cache:
32, 64, 96, ..., 1K, 2K, 4K, ...1M, 2M, 4M
2. 把 5 個靜態變數替換掉
128
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initarray_generic
initkmem_list3[1]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
1. 為以下 size 產生 kmem_cache:
32, 64, 96, ..., 1K, 2K, 4K, ...1M, 2M, 4M
2. 把 5 個靜態變數替換掉
3. 產生 radix_tree_node 的 kmem_cache
130
kmem_cache
nodelists[0]
next
array[0]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
initkmem_list3[0]
cache_cache
kmem_cache
nodelists[0]
next
array[0]
initarray_cache
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
initarray_generic
initkmem_list3[1]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
initkmem_list3[2]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x27]
entry[0x0]
entry[0x78]
kmem_cache
nodelists[0]
next
array[0]
slabs_partial
kmem_list3
slabs_free
slabs_full
arraycache_init
batchcount
cache
entry[0x0]
entry[0x77]
entry[0x3B]
entry[0xD]
entry[0x36]
1. 為以下 size 產生 kmem_cache:
32, 64, 96, ..., 1K, 2K, 4K, ...1M, 2M, 4M
2. 把 5 個靜態變數替換掉
3. 產生 radix_tree_node 的 kmem_cache
4. 替換每個 kmem_cache 的 array_cache
131
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
vmalloc
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
11. 釋放 bank 之間對應的 struct page 給 bootmem
12. 把所有 free page & bitmap 轉給 buddy system
13. 建立 kmem cache
14. 建立 per-cpu 的 pageset
0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC002C000, kernel(text, data)
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init)
0xC0004000, page table
0xC0000100, boot args
132
node_zones[ZONE_NORMAL_MIU0]
zone_start_pfn
spanned_pages
present_pages
name
zone_start_pfn
spanned_pages
present_pages
name
node_zones[ZONE_NORMAL]
pg_data_t
0x9BC6
0x9D00
0x40200
"Normal_MIU0"
0x49F00
0x65E00
0x2E44
"Normal"
contig_page_data
zonelist
_zonerefs[0]
_zonerefs[1]
zone
zone
pageset
pageset
for cpu0
for cpu1
static
static
dynamic
+ reserve
dynamic
+ reserve
( 示意圖 )
pcp
high
batch
per_cpu_pageset
0x6
lists
0x1
pcp
high
batch
per_cpu_pageset
0x2A
lists
0x7
pcp
high
batch
per_cpu_pageset
0x6
lists
0x1
pcp
high
batch
per_cpu_pageset
0x2A
lists
0x7
per-cpu area
for cpu0
for cpu1
for cpu0
for cpu1
133
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
lru
page
*. 如果 order = 0, page --> pageset
1. 檢查第 1 組 32 bit, 存在 reserve bit
1.1. 一次 1 個 , page --> pageset --> buddy system
pcp
high
batch
per_cpu_pageset
lists
for zone0
pcp
high
batch
per_cpu_pageset
lists
for zone1
lru
page
lru
page
0x2A
0x7
0x6
0x1
134
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
pg_data_t
node_zones[ZONE_NORMAL_MIU0]
node_zones[ZONE_NORMAL]
contig_page_data
free_area[0]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[1]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[2]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[3]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[4]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[5]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[6]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[7]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[8]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[9]
free_list[UNMOVABLE]
free_list[MOVABLE]
free_area[10]
free_list[UNMOVABLE]
free_list[MOVABLE]
lru
page
pcp
high
batch
per_cpu_pageset
lists
for zone0
pcp
high
batch
per_cpu_pageset
lists
for zone1
lru
page
0x2A
0x7
0x6
0x1
lru
page
如果有 pageset 的 threshold 有設 --> 發揮作用
--> page 不會馬上 bypass 到 buddy system
135
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
vmalloc
0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC002C000, kernel(text, data)
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init)
0xC0004000, page table
0xC0000100, boot args
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
11. 釋放 bank 之間對應的 struct page 給 bootmem
12. 把所有 free page & bitmap 轉給 buddy system
13. 建立 kmem cache
14. 建立 per-cpu 的 pageset
15. 設定 zone 的 threshold
136
node_zones[ZONE_NORMAL_MIU0]
present_pages
pg_data_t
contig_page_data
watermark[MIN]
watermark[LOW]
watermark[HIGH]
lowmem_reserve[MIU0]
lowmem_reserve[NORMAL]
present_pages
watermark[MIN]
watermark[LOW]
watermark[HIGH]
lowmem_reserve[MIU0]
lowmem_reserve[NORMAL]
node_present_pages
node_zones[ZONE_NORMAL]
( 跳過 )
138
1. start_kernel 初始狀況 (MMU, mapping)
2. 從 boot args 讀取 memory 範圍
3. 更新 mapping
4. 建立 bitmap, 預留位置 (bitmap, kernel, page table)
5. 建立 section info & struct page array
6. 設定 node & zone
7. 新增 mapping: vector table & mstar & twd & L2
8. 複製 vector table
9. 建立 & 複製 per-cpu data
10. 設定 zone 的 fallback list
11. 釋放 bank 之間對應的 struct page 給 bootmem
12. 把所有 free page & bitmap 轉給 buddy system
13. 建立 kmem cache
14. 建立 per-cpu 的 pageset
15. 設定 zone 的 threshold
16. 釋放 kernel 的 init 部份給 buddy system
Physical Address Virtual Address
0x40000000
0x60000000
0xA0000000
0xC0000000
0x00000000
59M
157M
216M
2
5
1
0
3
4
6
7
vmalloc
0xC0D46000, per-cpu data(for cpu1)
0xC0000000, section info
0xFFFF0000, vector table
0xC0D36000, per-cpu data(for cpu0)
0xC051E000, struct page array
0xC002C000, kernel(text, data)
0xC0029000, per-cpu data
0xC0009E04, vector table
0xC0008000, kernel(init)
0xC0004000, page table
0xC0000100, boot args
139
RAM
bootmem
allocator
struct
page
array
pageset
buddy system
per-cpu
area
140
Physical Address Virtual Address
0x00000000
static
static
dynamic
+ reserve
dynamic
+ reserve
page
page
page
page
pcp
high
batch
per_cpu_pageset
listslru
page
lru
page
pcp
high
batch
per_cpu_pageset
listslru
page
lru
page
RAM
bootmem
allocator
struct
page
array
pageset
buddy system
per-cpu
area
141
pageset
per-cpu
area
kmem cache
buddy system
other
place
in
kernel
page
page page
pages
pages
bytes
142
pcp
high
batch
per_cpu_pageset
listslru
page
lru
page
pcp
high
batch
per_cpu_pageset
listslru
page
lru
page
static
static
dynamic
+ reserve
dynamic
+ reserve
pageset
buddy system
per-cpu area
other
place
in
kernel
143
End

More Related Content

What's hot

Debugging Ruby
Debugging RubyDebugging Ruby
Debugging RubyAman Gupta
 
Linux Timer device driver
Linux Timer device driverLinux Timer device driver
Linux Timer device driver艾鍗科技
 
[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)
[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)
[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)Simen Li
 
Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Ontico
 
ch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystemch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystemyushiang fu
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction magoroku Yamamoto
 
E nodeb useful commands for rf engineer
E nodeb useful commands for rf engineerE nodeb useful commands for rf engineer
E nodeb useful commands for rf engineerVishal Padhya
 
Tracer Evaluation
Tracer EvaluationTracer Evaluation
Tracer EvaluationQiao Han
 
MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)Masami Hiramatsu
 
제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀EXEM
 
クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価Ryousei Takano
 
PostgreSQL performance archaeology
PostgreSQL performance archaeologyPostgreSQL performance archaeology
PostgreSQL performance archaeologyTomas Vondra
 
Linux MMAP & Ioremap introduction
Linux MMAP & Ioremap introductionLinux MMAP & Ioremap introduction
Linux MMAP & Ioremap introductionGene Chang
 
Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)yang firo
 
A little systemtap
A little systemtapA little systemtap
A little systemtapyang bingwu
 
Roll your own toy unix clone os
Roll your own toy unix clone osRoll your own toy unix clone os
Roll your own toy unix clone oseramax
 

What's hot (20)

Debugging Ruby
Debugging RubyDebugging Ruby
Debugging Ruby
 
Linux Timer device driver
Linux Timer device driverLinux Timer device driver
Linux Timer device driver
 
[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)
[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)
[嵌入式系統] MCS-51 實驗 - 使用 IAR (2)
 
Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)Performance tweaks and tools for Linux (Joe Damato)
Performance tweaks and tools for Linux (Joe Damato)
 
ch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystemch8-pv1-the-virtual-filesystem
ch8-pv1-the-virtual-filesystem
 
Linux Device Tree
Linux Device TreeLinux Device Tree
Linux Device Tree
 
MySQLinsanity
MySQLinsanityMySQLinsanity
MySQLinsanity
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction
 
E nodeb useful commands for rf engineer
E nodeb useful commands for rf engineerE nodeb useful commands for rf engineer
E nodeb useful commands for rf engineer
 
Tracer Evaluation
Tracer EvaluationTracer Evaluation
Tracer Evaluation
 
MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)MINCS - containers in the shell script (Eng. ver.)
MINCS - containers in the shell script (Eng. ver.)
 
Page table manipulation attack
Page table manipulation attackPage table manipulation attack
Page table manipulation attack
 
SOFA Tutorial
SOFA TutorialSOFA Tutorial
SOFA Tutorial
 
제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 6회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価クラウド環境におけるキャッシュメモリQoS制御の評価
クラウド環境におけるキャッシュメモリQoS制御の評価
 
PostgreSQL performance archaeology
PostgreSQL performance archaeologyPostgreSQL performance archaeology
PostgreSQL performance archaeology
 
Linux MMAP & Ioremap introduction
Linux MMAP & Ioremap introductionLinux MMAP & Ioremap introduction
Linux MMAP & Ioremap introduction
 
Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)Linux kernel debugging(ODP format)
Linux kernel debugging(ODP format)
 
A little systemtap
A little systemtapA little systemtap
A little systemtap
 
Roll your own toy unix clone os
Roll your own toy unix clone osRoll your own toy unix clone os
Roll your own toy unix clone os
 

Similar to Ch. 3: Memory Management in Linux

Linux Initialization Process (2)
Linux Initialization Process (2)Linux Initialization Process (2)
Linux Initialization Process (2)shimosawa
 
Physical Memory Models.pdf
Physical Memory Models.pdfPhysical Memory Models.pdf
Physical Memory Models.pdfAdrian Huang
 
Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020
Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020
Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020Eric Lin
 
Vmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is bootedVmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is bootedAdrian Huang
 
Linux Porting
Linux PortingLinux Porting
Linux PortingChamp Yen
 
Kvm performance optimization for ubuntu
Kvm performance optimization for ubuntuKvm performance optimization for ubuntu
Kvm performance optimization for ubuntuSim Janghoon
 
Raspberry Pi tutorial
Raspberry Pi tutorialRaspberry Pi tutorial
Raspberry Pi tutorial艾鍗科技
 
망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10종인 전
 
System Booting Process overview
System Booting Process overviewSystem Booting Process overview
System Booting Process overviewRajKumar Rampelli
 
Linux Kernel Tour
Linux Kernel TourLinux Kernel Tour
Linux Kernel Toursamrat das
 
COSCUP 2020 RISC-V 32 bit linux highmem porting
COSCUP 2020 RISC-V 32 bit linux highmem portingCOSCUP 2020 RISC-V 32 bit linux highmem porting
COSCUP 2020 RISC-V 32 bit linux highmem portingEric Lin
 
Когда предрелизный не только софт
Когда предрелизный не только софтКогда предрелизный не только софт
Когда предрелизный не только софтCEE-SEC(R)
 
malloc & vmalloc in Linux
malloc & vmalloc in Linuxmalloc & vmalloc in Linux
malloc & vmalloc in LinuxAdrian Huang
 
Juniper防火墙case信息收集表
Juniper防火墙case信息收集表Juniper防火墙case信息收集表
Juniper防火墙case信息收集表mickchen
 
Advanced Root Cause Analysis
Advanced Root Cause AnalysisAdvanced Root Cause Analysis
Advanced Root Cause AnalysisEric Sloof
 
Assignment of SOS operating systemThe file lmemman.c has one incom.pdf
Assignment of SOS operating systemThe file lmemman.c has one incom.pdfAssignment of SOS operating systemThe file lmemman.c has one incom.pdf
Assignment of SOS operating systemThe file lmemman.c has one incom.pdfsktambifortune
 
Understanding the virtual memory - Ixia Connect #2
Understanding the virtual memory - Ixia Connect #2Understanding the virtual memory - Ixia Connect #2
Understanding the virtual memory - Ixia Connect #2IxiaRomania
 

Similar to Ch. 3: Memory Management in Linux (20)

Linux Initialization Process (2)
Linux Initialization Process (2)Linux Initialization Process (2)
Linux Initialization Process (2)
 
Physical Memory Models.pdf
Physical Memory Models.pdfPhysical Memory Models.pdf
Physical Memory Models.pdf
 
Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020
Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020
Experience on porting HIGHMEM and KASAN to RISC-V at COSCUP 2020
 
Vmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is bootedVmlinux: anatomy of bzimage and how x86 64 processor is booted
Vmlinux: anatomy of bzimage and how x86 64 processor is booted
 
Linux Porting
Linux PortingLinux Porting
Linux Porting
 
Kvm performance optimization for ubuntu
Kvm performance optimization for ubuntuKvm performance optimization for ubuntu
Kvm performance optimization for ubuntu
 
Raspberry Pi tutorial
Raspberry Pi tutorialRaspberry Pi tutorial
Raspberry Pi tutorial
 
망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10
 
System Booting Process overview
System Booting Process overviewSystem Booting Process overview
System Booting Process overview
 
Linux Kernel Tour
Linux Kernel TourLinux Kernel Tour
Linux Kernel Tour
 
Build Your OS Part1
Build Your OS Part1Build Your OS Part1
Build Your OS Part1
 
COSCUP 2020 RISC-V 32 bit linux highmem porting
COSCUP 2020 RISC-V 32 bit linux highmem portingCOSCUP 2020 RISC-V 32 bit linux highmem porting
COSCUP 2020 RISC-V 32 bit linux highmem porting
 
Когда предрелизный не только софт
Когда предрелизный не только софтКогда предрелизный не только софт
Когда предрелизный не только софт
 
malloc & vmalloc in Linux
malloc & vmalloc in Linuxmalloc & vmalloc in Linux
malloc & vmalloc in Linux
 
Juniper防火墙case信息收集表
Juniper防火墙case信息收集表Juniper防火墙case信息收集表
Juniper防火墙case信息收集表
 
Advanced Root Cause Analysis
Advanced Root Cause AnalysisAdvanced Root Cause Analysis
Advanced Root Cause Analysis
 
Analisis_avanzado_vmware
Analisis_avanzado_vmwareAnalisis_avanzado_vmware
Analisis_avanzado_vmware
 
Assignment of SOS operating systemThe file lmemman.c has one incom.pdf
Assignment of SOS operating systemThe file lmemman.c has one incom.pdfAssignment of SOS operating systemThe file lmemman.c has one incom.pdf
Assignment of SOS operating systemThe file lmemman.c has one incom.pdf
 
Understanding the virtual memory - Ixia Connect #2
Understanding the virtual memory - Ixia Connect #2Understanding the virtual memory - Ixia Connect #2
Understanding the virtual memory - Ixia Connect #2
 
Embedded C - Lecture 4
Embedded C - Lecture 4Embedded C - Lecture 4
Embedded C - Lecture 4
 

Ch. 3: Memory Management in Linux