SlideShare a Scribd company logo
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 1
背景圖來源:
https://www.wallsauce.com/eu/designer-wallpaper-
murals/natural-history-museum-dinosaurs-pattern-wall-
mural
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 2
前言:
版本:0.1
假如你想收到最新的作業系統資訊,請填寫底下表格,這份投影片每半年到一年會有一
次大更新,我會將更新資訊寄給您
https://goo.gl/GzqoXo
台灣的資訊教育較為特別,幾乎所有資工系的學生都要「考」研究所,因此無法直接使
用國外的教材
目前網路上看到大部分的教材都是pdf形式,無法修改,授課老師無法依照學生的需求,
增減資料
我希望能用幾年的時間,完成沒有版權問題,涵蓋恐龍本基本觀念,並以Linux為基礎的
作業系統簡介投影片
作業系統非常龐大,很多地方是我沒接觸過的、沒研究過的,因此投影片當中可能會有
不少錯誤
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 3
前言:
這份投影片對讀者(學生)的設定如下
略懂資料結構、演算法
「真的」會寫程式
約略看懂組合語言
了解Linux system programming,例如基本的fork、pipe、signal等等
由於計算機結構是研究所的內容,因此相關的部分會在投影片內交代清楚
(大學部只修過計算機組織)
恐龍本中涵蓋,但不重要的部分我放在投影片最後面的「補充的名詞解釋」
這份投影片依然以介紹概念為主,與恐龍本不同的是以Linux為例介紹概念
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 4
接下來的規劃
橋接恐龍書和Linux上,讓到業界的新鮮人可以透過這份投影片
快速了解整個Linux架構
更加模組化,教師可以選擇自己喜歡的部分,組成一個章節
每個章節都提供一個夠有代表性的實作
每個章節提供一系列的課後問題
提供更進階的部分
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 5
課程大綱
DRAM在PC上的實體配置方式
記憶體的配置與使用
Fragmentation(記憶體碎裂問題)
50 percent rule(碎裂問題,將導致1/3記憶體無用)
考慮靜態系統,ARM Cortex-M的記憶體保護機制
現代處理器的記憶體管理(MMU)機制
在CPU中MMU與cache memory的相對位置
TLB miss與translation table structure
硬體方法
(天外飛來一筆)Linux中的memory layout
(天外飛來一筆)share memory
軟體方法
完全解決external fragmentation問題了嗎?看看malloc!
討論
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 6
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 7
X86的啟動 – BIOS的位置
x86的啟動時,執行的第一行程式碼一定是FFFF:0000,因此主
機板在焊電路的時候,必須使用address decoder將FFFF:0000
對應到BIOS的進入點
隨後經過一連串的軟硬體設定,進入作業系統的進入點,以
Linux為例,隨後進入start_kernel,開始作業系統主要的初始化
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 8
BIOS對記憶體的使用
BIOS的資料不需要電力就可以保存
但BIOS的速度通常較DRAM要來慢
為什麼不用flash memory呢?因為flash memory是block device,而接
到CPU的「記憶型裝置」必須是byte addressable
大部分的BIOS會將自己複製到DRAM中,然後配置自己的code、
data section、stack section
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 9
BIOS和RAM
https://clipartpng.com/?741,computer-cpu-png-clipart
http://chittagongit.com/icon/bios-icon-4.html
http://www.pngmart.com/image/43960
address decoder
FFFF:0000
FFFF:FFFF
共65K
除BIOS以外,其他
位址定址到DRAM
假設DRAM共4GB
• 在這一個系統中,由於address
decoder固定將
FFFF:0000~FFFF:FFFF映射到
BIOS
• 因此我們無法存取主記憶體上的
FFFF:0000~FFFF:FFFF,共65K,
幸好問題不嚴重
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 10
RAM和VRAM(GPU上面的RAM)
address decoder 除BIOS以外,其他
位址定址到DRAM
假設DRAM共4GB
https://www.deviantart.com/flava0ne/art/techPowerUp-GPU-Z-Icon-
640667776
假設顯示卡上面有
128MB的VRAM
32位元處理器,
最多定址4GB
• 處理器只能定址4GB,但「裝
置+DRAM」就已經是
4.125GB
• 怎麼辦?
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 11
如果記憶體只有256MB或512MB的
memory layout
https://resources.infosecinstitute.com/system-address-map-
initialization-in-x86x64-architecture-part-1-pci-based-systems/#gref
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 12
https://www.quora.com/Why-does-my-motherboard-see-only-3-25-GB-
out-of-4-GB-RAM-installed-in-my-PC
如果DRAM是4GB
• 由於PCI等裝置與DRAM
共用同一塊address
space
• 4GB扣除掉PCI等裝置所
使用的記憶體後,只剩下
3.25GB
• 解決之道:邁向64位元
• 64位元不只可以解決記憶
體定址的問題,還可以解
決「檔案不能超過2GB」
的問題
4GB
可用記憶體
4096MB-750MB-20MB-1MB
=3.25GB
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 13
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000059000-0x000000000009efff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009f000-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000031135fff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000031136000-0x0000000031136fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x0000000031137000-0x0000000031180fff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000031181000-0x000000003a1a9fff] usable
[ 0.000000] BIOS-e820: [mem 0x000000003a1aa000-0x000000003a4f4fff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000003a4f5000-0x000000003a530fff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x000000003a531000-0x000000003ae29fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x000000003ae2a000-0x000000003b293fff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000003b294000-0x000000003b2fdfff] type 20
[ 0.000000] BIOS-e820: [mem 0x000000003b2fe000-0x000000003b2fefff] usable
[ 0.000000] BIOS-e820: [mem 0x000000003b300000-0x000000003b3fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000008beffffff] usable
31,728MB
351KB
279KB
784MB
144MB
4KB
OS lab伺服器
(Ubuntu 18.04 AMD64)
• 使用「dmsg」看開機訊
息
• 實體記憶體為:
• 32GB=32,768MB
• BIOS分配以後為:
• 31.9MB=32,656MB
• 可以發現address
decoder可以將DRAM映
射到不同的地方
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 14
RAM和VRAM(GPU上面的RAM)
address decoder
可以動態的將physical
address映射到不同裝
置
DRAM共32GB
https://www.deviantart.com/flava0ne/art/techPowerUp-GPU-Z-Icon-
640667776
假設顯示卡上面有
128MB的VRAM
64位元處理器,
physical address
space可達
248=256TB
physical
address
注意,是physical address
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 15
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000001000-0x0000000000ffffff]
[ 0.000000] DMA32 [mem 0x0000000001000000-0x00000000ffffffff]
[ 0.000000] Normal [mem 0x0000000100000000-0x00000008beffffff]
[ 0.000000] Device empty
[ 0.000000] e820: [mem 0x40000000-0xdfffffff] available for PCI devices
[ 0.000000] Kernel/User page tables isolation: enabled
OS lab伺服器
(Ubuntu 18.04 AMD64)
• DMA及DMA32分別是保
留給16/32位元的DMA
controller使用
• normal,可以給任何能定
址64位元的裝置使用(例
如:CPU)
小常識,這個是為了要避免SPECTRE之類的
攻擊,讓kernel擁有自己的page table(後
面會介紹),這個「補丁」的缺點是「降低
system call」的效能
[ 0.000000] BIOS-e820:
[mem 0x0000000100000000-0x00000008beffffff]
usable
第9頁
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 16
00001000-00057fff : System RAM
00059000-0009efff : System RAM
00100000-31135fff : System RAM
31181000-3a1a9fff : System RAM
100000000-8beffffff : System RAM
6d7000000-6d7c031d0 : Kernel code
6d7c031d1-6d866a03f : Kernel data
6d88e2000-6d8b3dfff : Kernel bss
279KB
351KB
784MB
144MB
31,728MB
OS lab伺服器
(Ubuntu 18.04 AMD64)
• cat /proc/iomem
• 這裡看到的是physical
address
可以與地9頁交叉對照一下
第9頁
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 17
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 18
關於DRAM的一些特性、使用
大部分的系統,只要CPU開始工作,DRAM就會全速運轉,即
使我們的系統上可能有多個DRAM插槽,這幾個DRAM被OS視
為一體
通常插滿記憶體,就是讓記憶體容量變大,頻寬變大,但OS無法獨立控
制各個記憶體(即:DIMM)
如果是NUMA架構,OS可以獨立控制。例如:AMD Threadripper是將
二顆CPU封裝在一起,二顆CPU各有自己的DRAM controller,因此對
OS、程式而言,分為remote和local二種不同記憶體,local速度比較快。
如果程式經過優化,可以將常用的擺在local不常用的擺在remote
如果沒有經過優化,那麼可以使用interleaving模式,獲得比較大的頻寬
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 19
關於DRAM的一些特性、使用
記憶體用量比較低,省不了多少電
DRAM的讀取和寫入還是耗電,但耗電不會太多
將資料保存在記憶體必須耗電
如果某一個區段的記憶體沒有真正的用途,那麼還是得耗電保存這些
「算是garbage的記憶體的內容」
記憶體的主要用途
執行程式的時候使用(例如:執行excel需要記憶體)
當快取記憶體使用,主要是當HDD或SSD的快取記憶體
充當buffer使用,和週邊裝置溝通的時候,需要預留一塊記憶體,讓裝
置可以讀取或寫入資料(例如:DMA)
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 20
OS lab伺服器
(Ubuntu 18.04 AMD64)
記憶體共有:32,826,708KB,31.3GB
沒有用到的記憶體有: 7,115,052KB,6.785GB
使用中的記憶體有: 470,464KB,0.449GB
被OS拿去當buffer或cache的有:25,241,192KB,24.07GB
由於記憶以不管使用或者不使用,都是耗電,因此OS會盡可能的將記憶體
用完,以OS Lab伺服器而言,大部分的記憶體作為cache,因此I/O效能變
得更好
類似像memory cleaner這樣的軟體,雖然會釋放記憶體,但可能會造成之
後的I/O效能變低。
KiB Mem : 32826708 total, 7115052 free, 470464 used, 25241192 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 31724376 avail Mem
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 21
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 22
記憶體配置
1. OS找出APP所需要的記憶體
程式碼
(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
通常稱之為.data
通常稱之為.bss
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 23
記憶體配置
2. OS將執行檔複製到記憶體
http://chittagongit.com/icon/binary-file-icon-1.html
堆疊空間
複製
程式碼
(.txt)
未給初始值的全域變數
給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 24
記憶體配置
3. OS將為給初始值的部分給「0」
堆疊空間
程式碼
(.txt)
給初始值的全域變數
0000000
0000000
0000000
0000000
初始化
為0
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 25
記憶體配置
3. OS將為給初始值的部分給「0」
堆疊空間
程式碼
(.txt)
給初始值的全域變數
ret. addr
int argc
char** argv
初始化
堆疊 未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 26
記憶體很大,CPU很快
可以同時載入多個程式
如右圖,同時載入「藍」「綠」「橘」
「黃」,四支程式
綠色程式所需要的記憶體最多,藍色的
最少
黑色虛線部分代表DRAM的大小
在這個例子中,「黃」的上面還有一部
分的空間沒用到
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 27
記憶體很大,CPU很快
可以同時載入多個程式
藍色執行結束
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 28
記憶體很大,CPU很快
可以同時載入多個程式
橘色執行結束
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 29
記憶體很大,CPU很快
可以同時載入多個程式
橘色執行結束
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 30
記憶體很大,CPU很快
可以同時載入多個程式
使用者想要執行一個大型程式,例如:
photoshop
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 31
記憶體很大,CPU很快
可以同時載入多個程式
剩下空間是足夠的
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 32
記憶體很大,CPU很快
可以同時載入多個程式
但photoshop塞不進去任何一塊連續的
空間
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
不夠🙅
🏻
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 33
記憶體很大,CPU很快
可以同時載入多個程式
但photoshop塞不進去任何一塊連續的
空間
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
不夠🙅
🏻
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 34
記憶體很大,CPU很快
可以同時載入多個程式
但photoshop塞不進去任何一塊連續的
空間
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
不夠🙅
🏻
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 35
如果free space夠多
但無法滿足記憶體需求
如果free space夠多,但無法滿足現有的記
憶體需求,就稱之為「External
fragmentation」
如果因為配置演算法,明明只需要X記憶體,
但卻分配了「X+ε」,多出來的「ε」稱之
為「internal fragmentation」
如右圖,如果OS覺得剩下的空間太小了,
沒辦法當作其他用途,而將剩下空間分配給
「黃」,那麼就是internal fragmentation
如果將這塊空間,分配給
「黃」,那麼這塊空間就是
internal fragmentation
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 36
解決fragmentation
如果可以將「綠」往下搬動,
那麼就可以有足夠多的空間,
容納「紅」
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 37
解決fragmentation
如果可以將「綠」往下搬動,
那麼就可以有足夠多的空間,
容納「紅」 堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 38
解決fragmentation
如果可以將「綠」往下搬動,
那麼就可以有足夠多的空間,
容納「紅」 堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
Photoshop
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 39
「綠」如何往下移
首先「綠」要能夠搬動,也就是他所用的「定址方式」必須是
相對定址。
例如:
regtarget = regbase + offset
LD/ST regtarget offset
regbase
• 在上述例子中,只要改變regbase就可以改變這個程式的記憶體的位
址
這個是指令格式
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 40
執行方式
為了增加擴充性,我們一次設
計三個「base register」,分
別是
basecode
basedata
basestack
由於我們一次增加三個暫存器,
因此應用程式可以放在不連續
的地方,code、data、stack可
以分開存放
base reg. file
basecode
basedata
basestack 堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 41
執行方式
load R1, basedata, 100
load R2, basestack, 30
sub R3, R1, R2
comp R3, 0
jmp_ge basecode+150
base reg. file
basecode
basedata
basestack 堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 42
搬移「綠」
由作業系統進行搬移
1. 首先將「綠」暫停執行
2. 將「綠」複製到指定位置
3. 重新設定base reg. file裡面各個暫
存器
base reg. file
basecode
basedata
basestack
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 43
搬移「綠」
base reg. file
basecode
basedata
basestack
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
load R1, basedata, 100
load R2, basestack, 30
sub R3, R1, R2
comp R3, 0
jmp_ge basecode+150
由於程式碼都是使用間接定址,因此只要修
改base reg. file後,原程式可以正確執行
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 44
切換行程
base reg. file
basecode
basedata
basestack
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
如果我們想從「綠」切換到
「黃」,除了切換普通暫存器
以外,還需要切換base reg.
file
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 45
切換行程
base reg. file
basecode
basedata
basestack
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
如果我們想從「綠」切換到
「黃」,除了切換「普通暫存
器」(general registers)以外,
還需要切換base reg. file
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 46
加入一些保護機制
base reg. file
basecode
basedata
basestack
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
為了預防程式碼寫錯,因此我
們依照各個segment的大小設
定limxxx
如果程式碼存取、執行錯誤的
記憶體,那麼會觸發
segmentation fault
limstack
limdata
limcode
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 47
加入一些保護機制
base reg. file
basecode
basedata
basestack
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
limstack
limdata
limcode
👇🏻 load R1, basedata, 100
👇🏻 load R2, basestack, 30
👇🏻 sub R3, R1, R2
👇🏻 comp R3, 0
👉🏻 jmp_ge basecode+150000
Y
https://tw.vector.me/browse/381954/tango_list_remove
https://www.kisspng.com/png-error-fault-computer-icons-clip-art-
cancel-button-794036/download-png.html
N
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 48
圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu
50 percent rule
⌾就算使用了一些最佳化的方法,external
fragmentation依然是非常嚴重的問題
⌾系統中不可以用的記憶體, 數量上是可
用記憶體的一半,故名之
⌾1/3的記憶體無法使用!
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 49
圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu
小結論
如果系統發生external fragmentation,可以藉由下列方式解
決
規定程式碼必須是「相對定址」
「搬移」程式
重新設定「base reg. file」
context switch的時候,除了切換general reg.以外還需要切換
「base reg. file」
加入了limXXX機制,確保同時執行多個程式時,程式之
間不會互相干擾
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 50
圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu
小結論
記憶體搬移非常的耗費時間,浪費記憶體頻寬
如果程式碼所需要的記憶體變多,那麼需要找到一個新
的空間、搬移記憶體,再設定base reg. file。
如果這是一個標準的POSIX系統,那麼fork非常的耗費時間,
因為POSIX規定,parent和child必須是獨立的記憶體空間
雖然程式碼、變數、堆疊可以分開配置,但就程式碼而
言,程式碼必須連續配置。變數、堆疊也有同樣的問題。
如果程式的各個區段可以拆開來,分別配置,可以大幅
度地降低「記憶體搬移」的overhead。甚至不需要記憶體搬
移。
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 51
圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu
小結論
如果是「靜態系統呢」
假設在系統建置的時候,我們就知道會有多少個程式,而且
程式的數量也不會變
在這樣的情況下,還有external fragmentation問題嗎?
如果沒有external fragmentation問題,那還需要記憶體搬移嗎?
如果沒有記憶體搬移,現在的記憶體管理架構是否夠用?
如果只需要記憶體保護機制,不需要記憶體管理機制
大致上只需要每個記憶體區塊「region」的base和limit
另外還需要描述每個「region」的讀、寫、執行的屬性
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 52
ARM Cortex-M為例
MPU_RBAR
相當於base
base [31:5] attr [4:0]
MPU_RLAR
相當於limit
limit [31:5] attr [4:0]
• 開始位址「32:5」只用了28bits,CPU會自動在28bits後填入00000 b,因此,每一個region的
開始位址必須是32的倍數
• 並且每一個region的大小, CPU會自動在28bits後填入00000 b也必須是32的倍數
• 綠色部分都是描述該region的「屬性」,在此略過不談
長度共32bits
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 53
base-limit reg. file
ARM Cortex-M為例
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 54
ARM Cortex-M為例
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
base [31:5] attr [4:0]
limit [31:5] attr [4:0]
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
堆疊空間
程式碼(.txt)
給初始值的全域變數
未給初始值的全域變數
virtual addr.
base-limit reg. file
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 55
ARM
Cortex-M為
例
https://community.arm.com/processors/trustzone-for-armv8-m/b/blog/posts/what-s-new-with-the-memory-
protection-unit-mpu-in-cortex-m23-and-cortex-m33
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 56
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 57
MMU在系統上的位置
address decoder
可以動態的將physical
address映射到不同裝
置
https://www.iconspng.com/image/34779/mapping-table
physical
address
注意,是physical address
MMU
logical
address
注意,是logical address
這裡所指的CPU及MMU通常會封裝在一起,
形成我們平常購買的「CPU」
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 58
DRAM
controller
cache
MMU
core
logical
addr.
phy.
addr.
平常我們買的
「CPU」包含了
core、MMU、
cache、DRAM
controller、PCIe
controller
在這張圖中,core
送出的add.先經過
MMU再到cache。
在真實硬體上,通
常L1、L2 cache在
MMU之前,L3
cache在MMU之後
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 59
DRAM
controller
cache
MMU
core
logical
addr.
phy.
addr.
平常我們買的
「CPU」包含了
core、MMU、
cache、DRAM
controller、PCIe
controller
為了解說上的方便,
我們假設core後面
緊接著MMU,之後
再接到cache
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 60
以邏輯意義為基礎的MMU設計
在這個設計中,給予程式中的各個區段一個「映射表」,如下圖所示有stack、
data、code三個「映射」
如果每一個區段可以是任意大小,還是會有「找到連續空間,塞進去該區段」
的問題,換句話說,無法解決fragmentation問題
MMU
logical
addr.
phy.
addr.
base reg. file
basecode
basedata
basestack limstack
limdata
limcode
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 61
新的MMU應該長成什麼樣子
管理的最小單位應該要更小,換句話說,要比code、data、
stack更小的管理單位
當MMU所管理的「記憶體單位」是任意大小時,會面臨嚴重的external
fragmentation問題
如果MMU的「管理單位」是「夠小」且「固定大小」,那麼不
會有external fragmentation問題。
假設管理單位是「100KB」,應用程式是「500MB」
很明顯的找到5120個「100KB」比找到連續的「500MB」更容易
因此解決了external fragmentation,也讓尋找「足夠多」的空間變得更
容易
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 62
新的MMU應該長成什麼樣子
「管理單位」是固定大小,那麼就必須分配給應用程式足夠大的
記憶體。
換句話說。我們會給出的記憶體是「管理單位」的倍數,而且比
應用程式還要來得大。
假設管理單位是「100KB」,應用程式是「500MB又30KB」
那麼我們必須找到5121個「100KB」,分配給該程式為「500MB又100KB」
100KB-30KB = 70KB,在這個例子中,internal fragmentation為70KB
假設程式共分3個不連續的邏輯區段,分別為code、data、stack,那麼
internal fragmentation的期望值為150KB
以這個例子而言, internal fragmentation只佔「150 ÷ 512000= 0.03%」
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 63
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 64
新的MMU應該長成什麼樣子
經由上面的討論,我們決定了MMU的「管理單位」要「夠小」
且「固定大小」
由於電腦系統常常以2n為最小單位,在這裏我們將管理單位設定為4KB
為了避免external fragmentation問題,限制「管理單位」的開始位置一
定要是4KB的倍數、
將「管理單位」命名為memory page,簡稱「page」
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 65
新的MMU應該長成什麼樣子
在過往,我們已basestack、basedata 、 basecode命名「管理單位」,address
為「basecode+150」
現在我們將「 basecode 」及「150」編碼到CPU送出的virtual address中
basecode :變成page number
「150」:變成offset
為了簡化細節、加強觀念的釐清,在這裡我們考慮32位元的處理器
因為每個page大小固定為4KB,因此不需要limstack、 limdata、limcode之類的欄位
page number offset
12bits
20bits
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 66
看看新設計的MMU
MMU
logical
addr.
phy.
addr.
mapping TBL
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x234 0x444
• 先拿page number「0x234」去mapping TBL查表,得到其對應值為「0x8E0」
• offset直接複製到phy. addr.
• 情況有點類似「basecode+150」的轉址, basecode會變,但150不會變
• 「150」相當於現在的「offset」,本例中offset為0x444
page
number offset
0x8E0 0x444
http://fastraxpos.com/wp-content/uploads/revslider/bio/
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 67
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x234 0x444
• 為了避免混淆,我們將還沒轉換前的address用<page, offset>表示,轉換後用
<frame, offset>表示
• 將mapping TBL,改命名為translation lookaside buffer(TLB)
frame
number offset
0x8E0 0x444
http://fastraxpos.com/wp-content/uploads/revslider/bio/
看看新設計的MMU
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 68
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x234 0x444
• 每當OS準備啟動一個行程時,OS必須將該行程所用到的記憶體的映射表格填入到TLB中
• Intel Sandy bridge的TLB數量
• Level 1 TLB(請注意,為了簡化,這裡的寫法不是很正確)
• i-TLB:72 entries(程式碼用的TLB)
• d-TLB:100 entries(資料用的TLB)
• Level 2 TLB:1024 entries(如果L1 TLB找不到,可以到L2 TLB找)
• 換句話說,程式碼+資料+堆疊 < 1024 × 4KB = 4MB
frame
number offset
0x8E0 0x444
http://fastraxpos.com/wp-content/uploads/revslider/bio/
https://stackoverflow.com/questions/40649655/how-is-the-size-of-tlb-in-intels-
sandy-bridge-cpu-determined
看看新設計的MMU
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 69
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x234 0x444
• 每當OS準備啟動一個行程時,OS必須將該行程所用到的記憶體的映射表格填入到
TLB中
• MIPS R8000-style的TLB數量 :384 entries
• 換句話說,程式碼+資料+堆疊 < 384 × 4KB = 1,536KB
frame
number offset
0x8E0 0x444
http://fastraxpos.com/wp-content/uploads/revslider/bio/
https://stackoverflow.com/questions/40649655/how-is-the-size-of-tlb-in-intels-
sandy-bridge-cpu-determined
看看新設計的MMU
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 70
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x234 0x444
• TLB的數量,限制了程式的大小
• x86架構下,程式碼+資料+堆疊 < 1024 × 4KB = 4MB
• MIPS架構下,程式碼+資料+堆疊 < 384 × 4KB = 1,536KB
• 解決之道
• 增加TLB數量
• 動態載入TLB
frame
number offset
0x8E0 0x444
http://fastraxpos.com/wp-content/uploads/revslider/bio/
https://stackoverflow.com/questions/40649655/how-is-the-size-of-tlb-in-intels-
sandy-bridge-cpu-determined
看看新設計的MMU
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 71
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 72
增加TLB數量
TLB基本上是一個「平行搜尋」的硬體
意即page number會同時和數十個到數百個TLB entries做比較,
如果擴充TLB會增加硬體成本
這裡的硬體成本可能為:電晶體數量、時脈降低、耗電等等
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 73
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 74
增加page size(frame size)
增加page size是個好主意,但page size越大,軟體在管理上的
彈性就越小(這下一個章節virtual memory會討論)
各種處理器幾乎都有「huge page的選項」
X86-64為例,有下列選項
4K, 2M and 1G (or 64K and 512M if one builds their own kernel with
CONFIG_ARM64_64K_PAGES=y)
Linux可以使用mmap配置記憶體,具有「MAP_HUGETLB」選
項
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 75
TLB夠用嗎?
ITLB
4 KiB page translations:
128 entries; 8-way set associative
dynamic partitioning
2 MiB / 4 MiB page translations:
8 entries per thread; fully associative
Duplicated for each thread
DTLB
4 KiB page translations:
64 entries; 4-way set associative
fixed partition
2 MiB / 4 MiB page translations:
32 entries; 4-way set associative
fixed partition
1G page translations:
4 entries; 4-way set associative
fixed partition
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 76
TLB夠用嗎?
STLB
4 KiB + 2 MiB page translations:
1536 entries; 12-way set associative.
1 GiB page translations:
16 entries; 4-way set associative
fixed partition
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 77
動態載入TLB entries
當MMU發現某一個記憶體位址的page number在TLB找不到對
應的entries時,可以觸發某種機制,將當下要用的TLB載入
記憶體很大,可以將所有的映射表存放在主記憶體中
但,硬體做?軟體做?
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 78
硬體來做好嗎?該如何做呢?
假設應用程式的大小是500MB,而且這個程式的所有「部分」
(例如:程式碼、資料、堆疊等等 )都是緊貼在一起的。
在這樣的情況下,需要多大的空間儲存mapping table(正式用
語是:page table)呢?
500MB/4KB = 128,000 entries
每個entries至少要22bits,處理器的最小存取單位是8bits,因此我們讓
每個entry使用32bits(32 是 2n存取比較有效率)
共128,000 × 4B = 512,000B = 500K
我們需要找到「連續的500K」的可用記憶體
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 79
硬體來做好嗎?該如何做呢?
回到老問題,假設有下面幾個應用程式,大小分別如下
500MB的應用程式,要找到「連續的500K」的可用記憶體放page table
700MB的應用程式,要找到「連續的700K」的可用記憶體放page table
650MB的應用程式,要找到「連續的650K」的可用記憶體放page table
1500MB的應用程式,要找到「連續的1500K」的可用記憶體放page table
要找到「連續的500K」、「再找到連續的700K」、「再找到連續的
650K」、「再找到連續的1,500K」…「再找到連續的…」…「再找到連
續的…」
這些程式會動態生成,也會消失。久而久之會造成external
fragmentation問題
paging本來是用來解決fragmentation,但自己也遭受fragmentation
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 80
4KB
1024 entries
✅ 第一層table最多可以有1024個entries
✅ 因此第二層最多有1024個table,每個第二層table最多1024
個entries
✅ 所以到第二層最多可以有1024 × 1024 = 1M 個entries
✅ 注意:第一層的page table entry(PTE)可以是NULL,不
指向table
第一層
page table
第二層
page table
硬體來做好嗎?
對「page table structure」再paging
為了避免用語上的混淆
✳ 整個在記憶體上,將virtual addr.轉成phy. addr.的資料結
構稱之為「page table structure」
✳ 必須放在連續記憶體區塊的的資料結構,稱之為page
table
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 81
硬體來做好嗎?
該如何做呢?
4KB
1024 entries
第一層
page table
第二層
page table data pages
� 第二層最多1M個entries
� 因此最多可以有1M個data block
� 每個data block的大小為4K
� 因此最多可以定址4GB的記憶體
� 注意:第二層的PTE也可以是
NULL
附註:硬體不是填上NULL,
這樣太耗時了,實際上是設定
invalid bit
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 82
圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu
注意到了嗎?
對page table進行paging以後,所有的「分配單位」,包
含:page table、data page的大小都4K,對OS來說,所有的
「分配單位」大小一樣,都對齊4K的倍數,徹底解決
external fragmentation問題
以我們的例子來說,32位元的CPU,logical address是32bits,
但page table entry只用了20個位元(因為對齊4K,後面12位
元不論值是什麼,MMU視而不見,MMU只看page number)
還剩下12個位元沒用到,這些位元在下個章節會被用
來描述「page的屬性」
https://no.m.wikipedia.org/wiki/Fil:Emblem-notice.svg
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 83
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 84
位址的表示方式
page number offset
12bits
20bits
LV2 PTE # offset
12bits
10bits
LV1 PTE #
10bits
原本的表
示方式
將page
table再
paging
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 85
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x3,6 0x444
offset
0x??? 0x444
3
PTBR
6
0xEE0
1. 在TLB找不
到0x3,6
frame
number
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 86
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x3,6 0x444
offset
0x??? 0x444
3
PTBR
6
0xEE0
2. 觸發CPU走訪page table
3. CPU先使用PTBR找到第一層page table
1. 在TLB找不
到0x3,6
frame
number
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 87
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x3,6 0x444
offset
0x??? 0x444
3
PTBR
6
0xEE0
2. 觸發CPU走訪page table
3. CPU先使用PTBR找到第一層page table
1. 在TLB找不
到0x3,6
4. 從第一層page table的第三個entry找
到第二層page table的開始位址
frame
number
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 88
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x234 0x8E0
0x456 0xFE0
page
number offset
0x3,6 0x444
offset
0x??? 0x444
3
PTBR
6
0xEE0
2. 觸發CPU走訪page table
3. CPU先使用PTBR找到第一層page table
1. 在TLB找不
到0x3,6
4. 從第一層page table的第三個entry找
到第二層page table的開始位址
5. 找到frame number
= 0xEE0
因此0x3,6 ⇒ 0xEE0
frame
number
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 89
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x3,6 0xEE0
0x456 0xFE0
page
number offset
0x3,6 0x444
offset
0x??? 0x444
3
PTBR
6
0xEE0
2. 觸發CPU走訪page table
3. CPU先使用PTBR找到第一層page table
1. 在TLB找不
到0x3,6
4. 從第一層page table的第三個entry找
到第二層page table的開始位址
5. 找到frame number
= 0xEE0
因此0x3,6 ⇒ 0xEE0
6. 找一個TLB entry,
將其置換成
0x3,6 ⇒ 0xEE0
frame
number
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 90
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x3,6 0xEE0
0x456 0xFE0
page
number offset
0x3,6 0x444
frame
number offset
0x??? 0x444
3
PTBR
6
0xEE0
2. 觸發CPU走訪page table
3. CPU先使用PTBR找到第一層page table
1. 在TLB找不
到0x3,6
5. 找到frame number
= 0xEE0
因此0x3,6 ⇒ 0xEE0
6. 找一個TLB entry,
將其置換成
0x3,6 ⇒ 0xEE0
4. 從第一層page table的第三個entry找
到第二層page table的開始位址
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 91
MMU
logical
addr.
phy.
addr.
TLB
0x100 0x200
0x102 0x423
0x212 0x440
0x3,6 0xEE0
0x456 0xFE0
page
number offset
0x3,6 0x444
frame
number offset
0xEE0 0x444
3
PTBR
6
0xEE0
2. 觸發CPU走訪page table
3. CPU先使用PTBR找到第一層page table
1. 在TLB找不
到0x3,6
5. 找到frame number
= 0xEE0
因此0x3,6 ⇒ 0xEE0
6. 找一個TLB entry,
將其置換成
0x3,6 ⇒ 0xEE0
8.
0x3,6 ⇒ 0xEE0
4. 從第一層page table的第三個entry找
到第二層page table的開始位址
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 92
MMU的轉換
在系統上的位置
address decoder
可以動態的將physical
address映射到不同裝
置
0xEE0,444
注意,是physical address
MMU
0x3,6,444
注意,是logical address
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 93
context-switch
MMU
logical
addr.
phy.
addr.
TLB
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
page table
structure
page table
structure
page table
structure
page table
structure
PTBR
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 94
context-switch
MMU
logical
addr.
phy.
addr.
TLB
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
page table
structure
page table
structure
page table
structure
page table
structure
PTBR
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 95
context-switch
MMU
logical
addr.
phy.
addr.
TLB
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
page table
structure
page table
structure
page table
structure
page table
structure
PTBR
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 96
context-switch
MMU
logical
addr.
phy.
addr.
TLB
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
0x??? 0x???
page table
structure
page table
structure
page table
structure
page table
structure
PTBR
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 97
背景圖來源:
https://www.wallsauce.com/eu/designer-wallpaper-
murals/natural-history-museum-dinosaurs-pattern-wall-
mural
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 98
Linux中task的
memory layout
.txt
.data
heap
stack
kernel 128TB
128TB
https://www.homecourt.ai/media-logos/
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 99
.txt
.data
heap
stack
kernel 8EB
8EB
Linux中task的
memory layout
1 Terabyte (TB) = 1024 GB
1 Petabyte (PB) = 1024 TB
1 Exabyte (EB) = 1024 PB
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 100
Linux中task的
memory layout
DRAM
.txt
.data
heap
stack
kernel
� 注意:右圖並沒有按照比例
� 將所有的DRAM映射到kernel space,
kernel space高達128GB,因此可以將
DRAM可以完全映射到kernel space
� 在user space方面,通常記憶體需求量
遠低於128GB
� 根據user space真正的需求配置DRAM
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 101
Linux中task的
memory layout
stack
heap
.data
.txt
DRAM
.txt
.data
heap
stack
kernel
� 注意:右圖並沒有按照比例
� 將所有的DRAM映射到kernel space,
kernel space高達128GB,因此可以將
DRAM可以完全映射到kernel space
� 在user space方面,通常記憶體需求量
遠低於128GB
� 根據user space真正的需求配置DRAM
� 如右圖,我們假設.txt、.data、heap、
stack都剛好是一個page
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 102
Linux中task的
memory layout heap
heap
stack
.txt
.data
heap
stack
.data
.txt
DRAM
.txt
.data
heap
stack
kernel
� 注意:右圖並沒有按照比例
� 將所有的DRAM映射到kernel space,
kernel space高達128GB,因此可以將
DRAM可以完全映射到kernel space
� 在user space方面,通常記憶體需求量
遠低於128GB
� 根據user space真正的需求配置DRAM
� 如右圖,我們假設.txt、.data、heap、
stack都剛好是一個page
� 假設從「藍」切換「綠」,並且「綠」
的heap比較大,佔了2個page
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 103
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 104
考慮
共用記憶體 heap
heap
stack
.txt
.data
shared
heap
stack
.data
.txt
DRAM
.txt
.data
heap
stack
kernel
� 「綠」和「藍」共用黃色記憶體,執行
綠色時,圖示如右
shared
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 105
heap
heap
stack
.txt
.data
shared
heap
stack
.data
.txt
DRAM
stack
kernel
.txt
.data
heap
shared
考慮
共用記憶體
� 「綠」和「藍」共用黃色記憶體,執行
綠色時,圖示如右
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 106
關於cache
DRAM
controller
cache
MMU
core
logical
addr.
phy.
addr.
� 在這份投影片,假設MMU是在cache之前,因
此送到cache全部都是phy. addr.(如右圖)
� 但在真實處理器,MMU的速度比較慢,會拉
長latency,因此很多處理器把L1$、L2$放在
MMU之前
� 如果cache在MMU之前稱之為virtual cache,
有數種方法可以解決
� 將cache中的資料全部清楚
� 加入ASID,這作業系統指定的一個數字,
不同於pid,<ASID, logical addr.>構成唯
一位址
� Virtually Indexed Physically Tagged,計算
機組織會介紹這個技巧,對OS來說可以看
成是phy. cache
http://wikiclipart.com/eraser-clip-art_33317/
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 107
TLB Miss的軟體解決方法
MIPS處理器使用了software-managed TLB,當TLB miss時將觸
發exception將由OS kernel進行後續處理
Three types of TLB exceptions can occur:
TLB Refill occurs when there is no TLB entry that matches an
attempted reference to a mapped address space.
TLB Invalid occurs when a virtual address reference matches a TLB
entry that is marked invalid.
TLB Modified occurs when a store operation virtual address reference
to memory matches a TLB entry which is marked valid but is not dirty
(the entry is not writable).
https://www.manualslib.com/manual/596187/Mips-Technologies-R4000.html?page=158#manual
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 108
TLB Miss的軟體解決方法
以TLB Refill為例,MIPS會告訴kernel到底發生「錯誤的原因」
及「錯誤發生的位址」
OS kernel可以依照「原因」及「位址」,並根據當時CPU正在執行哪一
個task,使用任何適當的演算法找出
所謂的「真的錯誤」,意即程式碼本身有問題,例如:指標用錯
另一種可能是OS未將該程式所需要的TLB entry放入TLB中
OS kernel可以使用「paged page table」,存放該程式的page
table structure,或者可以使用hash,更快速的找到「映射」。
或許可以同時載入多個TLB entries(例如:OS很肯定某些page
會一起使用)。
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 109
TLB Miss的軟體解決方法
優點:
透過軟體,可以做更有效的搜尋,甚至修改搜尋演算法
可以加入更智能的功能,將未來「也可能造成TLB miss」的「映射」放
入TLB中
缺點:
exception牽涉到「mode change」需要耗費一些時間
部分的MIPS型號內建硬體機制自動走訪page table
部分SPARC、POWER處理器允許使用軟體處理TLB miss
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 110
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 111
配置記憶體的真實情況
大部分的應用程式,配置記憶體時,大小幾乎都不等於4K的倍
數
但作業系統透過硬體能夠解決的是「4K page」的
fragmentation問題,因此我們還需要一些軟體方法解決「隨意
大小」配置問題
上述問題同時存在於「user task」與「kernel task」,在本小節
中分別進行討論
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 112
作業系統的記憶體分配架構
kernel space
user space
1. 這代表系統中所有的frame,例如
4GB,就有1M個frame,我們首先解
決frame分配的問題
2. kernel library,提
供kmalloc,給
kernel task使用
3. libc,提供malloc等
函數給user task使
用
接下來我們分別對下列議題進行討論
1. kernel如何分配frame 🏻🏻♀️→🙋🏻♀️
2. kernel如何實現kmalloc
3. libc如何實現malloc
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 113
1. kernel對frame的管理
如下圖,kernel透過MMU的協助,將記憶體視為大小為4K的
page進行管理
kernel將所有的DRAM映射到kernel space中,因此kernel可以
直接存取任何記憶體。即便kernel已經將這塊記憶體分配給user
task了,kernel還是可以存取該塊記憶體
因此kernel內部必須小心的處理所有的記憶體,記憶體幾乎是赤
裸裸的供給kernel使用
1. 這代表系統中所有的frame,例如
4GB,就有1M個frame,我們首先解
決frame分配的問題
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 114
1. kernel對frame的管理
過去Linux kernel將記憶體設定為全部都可以讀、寫、執行,新
的Linux kernel依照「該page」的使用方式,設定讀、寫、執行
等屬性,以增加系統安全性
如果Linux kernel將一個page配置給user space,那麼這個page
最少會有二個virtual address。MMU將該frame映射到kernel
space及user space
kernel初始化時,就將所有的RAM映射到kernel space
當user task需要記憶體時,kernel可以將該frame映射到user space
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 115
複習
右圖中,shared有
三個virtual address,
分別屬於「綠」、
「藍」及kernel
藍色的部分則有二
個virtual address,
分別屬於「藍」、
kernel
綠色的部分則有二
個virtual address,
分別屬於「綠」、
kernel
DRAM
.txt
.data
heap
stack
kernel
space
.txt
.data
heap
stack
kernel
space
heap
heap
stack
.txt
.data
shared
heap
stack
.data
.txt
shared
shared
藍的addr. space
綠的addr. space
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 116
1. kernel對frame的管理
如下圖,kernel將所有的記憶體映射到kernel space,由於
kernel使用軟體方法管理記憶體,因此使用huge page將記憶體
映射到kernel space
例如:在一台具有32GB記憶體的x86-64上,只需要32個huge TLB就可
以將32GB完整的映射到kernel space(註:x86-64的huge page可達
1GB)
因為核心使用huge TLB,因此只能靠軟體技術管理記憶體
huge TLB帶來非常大的效能改善,Intel Sandy bridge的TLB數量為1024
個,在這個例子中,核心只用掉32個TLB entries
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 117
1. kernel對frame的管理
如下圖,kernel將所有的記憶體映射到kernel space,因此
kernel必須知道哪些frame已經分配出去了,哪些frame是free的
當記憶體釋放回kernel時(即:變為free frame),必須能快速
的合併free frame成為更大塊的free frame,避免fragmentation
在下圖中,藍色的部分代表已經分配出去的frame,白色的部分
代表free frame
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 118
1. kernel對frame的管理-buddy system
假設系統中共有32個frame,下圖展示了Linux如何管理這32個frame。
經過一連串的配置、釋放記憶體後,產生了一些fragmentation,Linux並無
法完全解決fragmentation,但透過buddy system減輕fragmentation問題
2 2 4 4 4 4 4 2 2 4
4
8 8 8
4
8
16 16
32
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 119
1. kernel對frame的管理-buddy system
下圖中,淺黃和深黃雖然相鄰,但不能合併,因為他們不是buddy
buddy的充分必要條件是「來自同一個父母」
深黃的父母是A,淺黃的父母是B,因此無法合併
2 2 4 4 4 4 4 2 2 4
4
8 8 8
4
8
16 16
32
B
A
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 120
1. kernel對frame的管理-buddy system
假設某個kernel task釋放「頭二個frame」(即:橘紅),那麼
橘紅和淺黃可以合併,因為他們的父母都是A
2 2 4 4 4 4 4 2 2 4
4
8 8 8
4
8
16 16
32
B
A
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 121
1. kernel對frame的管理-buddy system
假設某個kernel task釋放「頭二個frame」,那麼
橘紅和淺黃可以合併,因為他們的父母都是A
2 4 4 4 4 4 4 2 2 4
8 8 8
4
8
16 16
32
B
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 122
1. kernel對frame的管理-buddy system
假設某個kernel task釋放「頭二個frame」,那麼
橘紅和淺黃可以合併,因為他們的父母都是A
淺黃和深黃又可以合併,因為他們的父母都是B
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 123
1. kernel對frame的管理-buddy system
假設某個kernel task釋放「頭二個frame」,那麼
橘紅和淺黃可以合併,因為他們的父母都是A
淺黃和深黃又可以合併,因為他們的父母都是B
因此,釋放掉「橘紅」以後,觸發一連串的合併,最後得到連續的8個free frame
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 124
1. kernel對frame的管理-buddy system
假設某個kernel task需要2個pages,kernel將「淡綠」配置出去
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 125
1. kernel對frame的管理-buddy system
假設某個kernel task需要2個pages,kernel將「淡綠」配置出去
又有一個kernel task需要2的page,但目前最小的free memory為「連續4個frame」
考慮「紫」
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 126
1. kernel對frame的管理-buddy system
假設某個kernel task需要2個pages,kernel將「淡綠」配置出去
又有一個kernel task需要2的page,但目前最小的free memory為「連續4個frame」
考慮「紫」
將「紫」拆成二個,分別是「淡紫」和「深紫」
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
4
4
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 127
1. kernel對frame的管理-buddy system
假設某個kernel task需要2個pages,kernel將「淡綠」配置出去
又有一個kernel task需要2的page,但目前最小的free memory為「連續4個frame」
考慮「紫」
將「紫」拆成二個,分別是「淡紫」和「深紫」
kernel將「深紫」分配出去
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
4
4
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 128
1. kernel對frame的管理-buddy system
配置二個,又配置二個以後,系統最後的樣貌如下圖
buddy system的重點
如果需要分割,必須「對稱」分割
如果相鄰的二個free frames需要合併,則他們必須源自於同一個父母
2 8 4 4 4 4 2 2 4
8 8
4
8
16 16
32
4
4
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 129
作業系統的記憶體分配架構
kernel space
user space
1. 這代表系統中所有的frame,例如
4GB,就有1M個frame,我們首先解
決frame分配的問題
2. kernel library,提
供kmalloc,給
kernel task使用
3. libc,提供malloc等
函數給user task使
用
接下來我們分別對下列議題進行討論
1. kernel如何分配frame
2. kernel如何實現kmalloc 🏻🏻♀️→🙋🏻♀️
3. libc如何實現malloc
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 130
Slab Allocator (注意,恐龍本有slab)
When cache created, filled with objects marked as free
When structures stored, objects marked as used
If slab is full of used objects, next object allocated from empty
slab
If no empty slabs, new slab allocated
Benefits include no fragmentation, fast memory request
satisfaction
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 131
Slab Allocation
https://medium.com/hungys-blog/linux-kernel-memory-
management-f2824ab7e66
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 132
Slab Allocation
https://medium.com/hungys-blog/linux-kernel-memory-
management-f2824ab7e66
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 133
Slab Allocation
kmem_
cache
(16B)
kmem_
cache
(32B)
kmem_
cache
(64B)
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 134
Slab Allocation
used
used
used
used
used
used
used
used
kmem_
cache
(16B)
kmem_
cache
(32B)
kmem_
cache
(64B)
slab
full
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 135
Slab Allocation
used
used
used
used
used
used
used
used
kmem_
cache
(16B)
used
used
used
used
slab
full
slab
partial
slab
free
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 136
作業系統的記憶體分配架構
kernel space
user space
1. 這代表系統中所有的frame,例如
4GB,就有1M個frame,我們首先解
決frame分配的問題
2. kernel library,提
供kmalloc,給
kernel task使用
3. libc,提供malloc等
函數給user task使
用
接下來我們分別對下列議題進行討論
1. kernel如何分配frame
2. kernel如何實現kmalloc
3. libc如何實現malloc🏻🏻♀️→🙋🏻♀️
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 137
malloc的位置
如左圖,標準的應用程式具有
heap,而malloc「幾乎」都是
從heap中找尋「閒置」的記憶
體
heap是連續配置的記憶體空間,
大小為4K的倍數
應用程式使用的記憶體往往不
等於4K的倍數
當我們呼叫malloc時,必須要
有適當的演算法,讓我們從
heap中找到所需的記憶體
heap
heap
stack
.txt
.data
heap
stack
.data
.txt
DRAM
stack
kernel
.txt
.data
heap
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 138
問題:為什麼不要用mmap
mmap的功能是一次向OS kernel要數個page大小的記憶體(通
常是4K的倍數)
malloc所需要的記憶體常常不跟4K扯不上任何關係
mmap是一個耗時的system call,為了安全性的原因,mmap所
得到的page都填入了0
如果沒有填進0會怎樣?會不會看到別的process的資料呢?
heap裡面的資料是重複使用的,因為heap的資料都隸屬於同一
個process,就算看到「之前的資料」,那麼舊資料也屬於同一
個process,因此不用保護隱私,換句話說,就是不用填0
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 139
heap的資料結構(ptmalloc)
https://jipanyang.wordpress.com/2014/06/09/glibc-malloc-internal-arena-bin-chunk-
and-sub-heap-1/
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 140
關於ptmalloc演算法
可以參考底下資料
https://goo.gl/ALHVoh
作者是:华庭(庄明强)
這篇文章的優點是除了解釋程式碼以外,也解釋了為什麼要這樣做
只用了126頁就將pmalloc解釋得很清楚
底下這個網頁也介紹了malloc的演算法
https://sourceware.org/glibc/wiki/MallocInternals
這個網頁解釋的比較模糊
請同學們自行學習
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 141
關於ptmalloc演算法
ptmalloc和「恐龍本」比較有關係的是「可用空間的選用」
first fit,找到第一個「可用空間」時就塞進去,恐龍本建議的方法
best fit,找到可以塞進去的「可用空間」中,最小的那一個,塞進去。
ptmalloc管理大型「可用空間」所採用的方法
worst fit,找到最大的空間塞進去。這個方法可以留下最多剩餘空間
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 142
章節結論
在本章節,如果系統屬於靜態系統,並沒有「動態配置記憶體」
問題時,使用簡單的memory protection unit是個不錯的方法
MPU只能做記憶體映射、記憶體屬性設定
使用MPU的情況下,如果需要「調動記憶體配置」,MPU管理的記憶體
單位太大,大小不定,會有「fragmentation」和「memory copy
overhead」
如果是動態系統,paging是比較好的方法
「page」大小一致,且對齊「page的大小」的倍數,雖然會有internal
fragmentation,但page夠小, internal fragmentation問題不大
對應表存在於MMU中的TLB,TLB的數量通常小於數千個entries
為了解決TLB數量有限的問題,必須使用軟體或者硬體方法動態載入當下
所需的TLB
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 143
章節結論
硬體方法
由MMU直接存取在主記憶體的「translation translation structure」,例如:
「page structure」。這個表格由OS kernel設定,讓MMU讀取的資料結構
優點是:TLB miss時不會觸發exception,減少切換到「TLB miss handler」的
overhead, 缺點是:很難用更好的演算法改善TLB的hit ratio
軟體方法
TLB miss時,MMU觸發exception通知處理器,由OS kernel處理這個問題
優點是:可以使用各式的資料結構予以優化,而且可以依照使用情境同時載入
多個TLB entries,減少miss ratio。缺點是:由正常的軟體執行程序切換到
exception handler,這個程序的overhead較硬體大。
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 144
章節結論
使用了MMU是否可以完全解決external fragmentation的問題
kernel如何分配page
kernel如何分配小塊記憶體
user space,尤其是libc如何分配記憶體
額外值得一提的是kernel在處理page的時候會發生「internal
fragmentation」問題嗎?
由於核心的virtual memory和DRAM是「one-to-one mapping」,勢必
會發生「free page」,不連續的問題
該如何解決?vmalloc
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 145
章節結論 – 進一步的推想
使用了MMU是否可以完全解決external fragmentation的問題
kernel如何分配page
kernel如何分配小塊記憶體
user space,尤其是libc如何分配記憶體
額外值得一提的是kernel在處理page的時候會發生「internal
fragmentation」問題嗎?
由於核心的virtual memory和DRAM是「one-to-one mapping」,勢必
會發生「free page」,不連續的問題
假設核心需要4M的連續記憶體,共要1K個page,系統中存在足夠多的
free page,但這些page不連續。該如何解決?vmalloc
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 146
章節結論 - 進一步的推想
kernel以使用MMU(kernel是否只能使用MMU存取主記憶體與
硬體架構相關,x86及ARM的Linux使用MMU)
週邊裝置,例如PCI使用的是physical memory addressing
kernel如何控制週邊裝置?
kernel知道哪一部分的linear memory對應到哪一部分的physical memory
例如:kernel要寫入實體位置100MB的位置,那就找出哪一個linear address對應到
該實體位置
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 147
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
解釋base register和limit register(於MPU中有這一段討論)
討論address binding的方式
這部分恐龍書有討論,包含了
compile time,直接產生「執行時期」的address,用於DOS時代
DOS主要的存活期間:從1981年直到1995年的15年間
同學們大約出生於1997年,但相對於「恐龍」存活於「2億3千萬年」,DOS算是
modern operating system
linkage editor
將靜態函數或者自己寫的其他函數庫編譯進去
loader
將程式碼放到「作業系統、linker」指定的位置,目前Linux都是採用相對位置,因此可
以載入到任意位置,也可以使用「ASLR」
execution time,使用MPU或MMU進行記憶體轉換
使用硬體做logical address到physical address的轉換
執行時期,OS可以調動process的位置,稱之為page migration
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 148
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
什麼是dynamic loading (重要,研究所)
執行時期將函數庫或者所需要的程式碼載入
可以由作業系統支援,也可以由應用程式自行支援
例如:很多遊戲,必須使用dynamic loading,在「換關」的時候載入哪
一個關卡所需要的資料、程式碼等等
什麼是dynamic linking (重要,研究所)
執行時期將「共用函數庫」載入
同一個「共用函數庫」在記憶體中只會存在一份,例如:Linux中只存在
一份libc
需要作業系統支援。因為只有作業系統知道哪些動態函數庫已經在記憶
體了。如果是,那麼只要做link就好,不需要載入
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 149
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
swapping,請注意「恐龍書」的swapping是,暫停應用程式,
並且將整個APP寫出到secondary storage
大部分來說,swap指的是對某些page暫時寫出到secondary storage,
這一部分下個章節討論
如果一個process執行read(fd, &buf, size),那麼OS會將資料寫
入到&buf中,但如果這個process被swap out,OS該怎麼辦?
(重要,研究所)
不允許正在進行I/O的process被swap out
OS暫時將資料存在OS kernel中,等這個process被swap in時,再將資料
寫到該buffer(「恐龍書」說:這個方法需要額外的記憶體複製,實際
的情況同學們可以自行思考一下)
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 150
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
iOS支援swapping,當一個APP在background時,iOS會回收這
個APP的大部分記憶體。
如果是修改過的記憶體,那麼iOS會保留在RAM中
Android在記憶體不足時,會terminate某些process
這些process的狀態(例如:stack、heap等「dirty」 pages)保存在
flash memory中,等待下次啟動回到上次的狀態
其實這個方法同iOS
但Android在排程演算法上是「真多功」,iOS是「智慧型多工」(或者
稱之為假多工),後者比較省電
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 151
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
memory allocation:partition方法
將記憶體切割成大小相等的partition,每個process佔用數個partition
早期的ARM使用這個方法,每個應用程式具有64個32MB的位址空間
在這個時期,WinCE(~WinCE 5.0,2004年)最多執行32個應用程
什麼是first fit、best fit、worst fit(重要,研究所)
什麼是external fragmentation、internal fragmentation(重要,
研究所)
什麼是50-percent rule(重要,研究所)
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 152
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
什麼是segmentation,請參考MPU的說明(重要,研究所)
OS使用「frame table」紀錄page的使用情況,例如是否分出
去了?分配給誰?
什麼是TLB(重要,研究所)
什麼是TLB miss(重要,研究所)
切換行程時TLB要怎樣處理?(重要,研究所)
flush
ASID
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 153
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
計算effective memory-access time(重要,研究所)
TLB_hit_ratio × access_timeTLB_hit + (1- TLB_hit_ratio) ×
access_timeTLB_miss
protection,在這個章節只介紹valid-invalid bit,相當於投影片
中的「NULL指標」的意思。什麼是valid-invalid bit
什麼是shared page
什麼是page table structure(請參考投影片中的TLB miss與
translation table structure中的「硬體方法」)(重要,研究所)
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 154
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
hashed page table (重要,研究所)
將virtual address拿去做hash,得到一個hash value,再拿這個hash
value到hash table去查詢該virtual address對應到哪一個physical
address
inverted page table(重要,研究所)
系統中只有一個page table
將<process-id, page number>到該page table逐一比對,如果在第「i」
個比對到,那麼這個page就是對應到第「i」個frame
「恐龍書」稍微介紹了SPARC,寫得沒有很清楚,但似乎是
「software-managed TLB」
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 155
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
IA-32的記憶體管理
先用segmentation unit(結構類似投影片中的MPU)將logical address
轉成linear address
再用paging unit(結構類似於投影片中的MMU中的hardware
management TLB)將physical address轉成physical address
page有二種size分別是4MB page及4KB page
如果第一層page table直接指向的data page就是4MB page
如果是第二層page table指向的data page就是4KB page
使用CR3暫存器指向第一層page table
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 156
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
目前x86-64的實際定址空間為248
48~63 bits的值與第47bit的值相同
page table分成四層
附註:在我們的投影片中,將轉換的整個資料結構稱之為「page table
structure」,而每層的轉換表稱之為「Xth page table」
x86-64將各層page table分別命名為「page map level 4」、「page
directory pointer table」、「page directory」、「page table」
支援4KB、2MB、1GB的data page
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 157
Quiz
注意,這裡列出來的問題都是恐龍書有的內容
ARM的page轉換
與投影片幾乎一樣
第一層的page table可以指向1MB或16MB的page
第二層的page table可以指向4KB或16KB的page
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 158
填寫學校問卷
https://miswww1.ccu.edu.tw/evaluation/001.php
https://goo.gl/iM8BS1
https://goo.gl/QP1ZRe
可以的話,請將大家的意見複製到這裡
創作共用-姓名 標示-非商業性-相同方式分享
CC-BY-NC-SA
中正大學 – 羅習五 159
作業系統概論基於GNU/Linux
中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com

More Related Content

Similar to operating system concepts - ch07 - main memory management

讓 Asp.net 在 raspberry pi 上飛
讓 Asp.net 在 raspberry pi 上飛讓 Asp.net 在 raspberry pi 上飛
讓 Asp.net 在 raspberry pi 上飛
dplayerd
 
Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會
Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會
Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會
Jason Cheng
 
Ruby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for MacRuby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for Mac
MarsZ Chen
 
Clonezilla tutorial.v7
Clonezilla tutorial.v7Clonezilla tutorial.v7
Clonezilla tutorial.v7hs1250
 
Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版redhat9
 
一次详细的渗透Wordpress教程
一次详细的渗透Wordpress教程一次详细的渗透Wordpress教程
一次详细的渗透Wordpress教程WASecurity
 
Spark在苏宁云商的实践及经验分享
Spark在苏宁云商的实践及经验分享Spark在苏宁云商的实践及经验分享
Spark在苏宁云商的实践及经验分享
alipay
 
Ox office現在。即未來(201509)
Ox office現在。即未來(201509)Ox office現在。即未來(201509)
Ox office現在。即未來(201509)
晟鑫科技股份有限公司
 
Hadoop开发者入门专刊
Hadoop开发者入门专刊Hadoop开发者入门专刊
Hadoop开发者入门专刊
liangxiao0315
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
maclean liu
 
Oda安装 恢复步骤
Oda安装 恢复步骤Oda安装 恢复步骤
Oda安装 恢复步骤
n-lauren
 
The Trend Of Cloud Computing And How Should Public Sectors Adjust
The Trend Of Cloud Computing And How Should Public Sectors AdjustThe Trend Of Cloud Computing And How Should Public Sectors Adjust
The Trend Of Cloud Computing And How Should Public Sectors AdjustJazz Yao-Tsung Wang
 
Build desktop app_by_xulrunner
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunnerRack Lin
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guidephantoxe
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guidephantoxe
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86
dbabc
 
twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1
twMVC
 
DRBL-live-hadoop at TSLC
DRBL-live-hadoop at TSLCDRBL-live-hadoop at TSLC
DRBL-live-hadoop at TSLC
Yu-Chin Tsai
 
icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介
Kito Cheng
 

Similar to operating system concepts - ch07 - main memory management (20)

讓 Asp.net 在 raspberry pi 上飛
讓 Asp.net 在 raspberry pi 上飛讓 Asp.net 在 raspberry pi 上飛
讓 Asp.net 在 raspberry pi 上飛
 
Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會
Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會
Proxmox VE 功能概觀、案例分享與實用工具 [2019/12/07] @Proxmox VE 中文使用者社團 2019 年會
 
Ruby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for MacRuby on Rails 開發環境建置 for Mac
Ruby on Rails 開發環境建置 for Mac
 
Clonezilla tutorial.v7
Clonezilla tutorial.v7Clonezilla tutorial.v7
Clonezilla tutorial.v7
 
Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版Bypat博客出品-利用cent os快速构建自己的发行版
Bypat博客出品-利用cent os快速构建自己的发行版
 
一次详细的渗透Wordpress教程
一次详细的渗透Wordpress教程一次详细的渗透Wordpress教程
一次详细的渗透Wordpress教程
 
Spark在苏宁云商的实践及经验分享
Spark在苏宁云商的实践及经验分享Spark在苏宁云商的实践及经验分享
Spark在苏宁云商的实践及经验分享
 
Ox office現在。即未來(201509)
Ox office現在。即未來(201509)Ox office現在。即未來(201509)
Ox office現在。即未來(201509)
 
Hadoop开发者入门专刊
Hadoop开发者入门专刊Hadoop开发者入门专刊
Hadoop开发者入门专刊
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
 
Oda安装 恢复步骤
Oda安装 恢复步骤Oda安装 恢复步骤
Oda安装 恢复步骤
 
The Trend Of Cloud Computing And How Should Public Sectors Adjust
The Trend Of Cloud Computing And How Should Public Sectors AdjustThe Trend Of Cloud Computing And How Should Public Sectors Adjust
The Trend Of Cloud Computing And How Should Public Sectors Adjust
 
Build desktop app_by_xulrunner
Build desktop app_by_xulrunnerBuild desktop app_by_xulrunner
Build desktop app_by_xulrunner
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guide
 
S3C44B0 User Guide
S3C44B0 User GuideS3C44B0 User Guide
S3C44B0 User Guide
 
Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86Oracle10g Rac Configuration For Linux X86
Oracle10g Rac Configuration For Linux X86
 
twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1twMVC#42 Windows容器導入由0到1
twMVC#42 Windows容器導入由0到1
 
美团技术团队 - KVM性能优化
美团技术团队 - KVM性能优化美团技术团队 - KVM性能优化
美团技术团队 - KVM性能优化
 
DRBL-live-hadoop at TSLC
DRBL-live-hadoop at TSLCDRBL-live-hadoop at TSLC
DRBL-live-hadoop at TSLC
 
icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介icecream / icecc:分散式編譯系統簡介
icecream / icecc:分散式編譯系統簡介
 

operating system concepts - ch07 - main memory management

  • 1. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 1 背景圖來源: https://www.wallsauce.com/eu/designer-wallpaper- murals/natural-history-museum-dinosaurs-pattern-wall- mural 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 2. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 2 前言: 版本:0.1 假如你想收到最新的作業系統資訊,請填寫底下表格,這份投影片每半年到一年會有一 次大更新,我會將更新資訊寄給您 https://goo.gl/GzqoXo 台灣的資訊教育較為特別,幾乎所有資工系的學生都要「考」研究所,因此無法直接使 用國外的教材 目前網路上看到大部分的教材都是pdf形式,無法修改,授課老師無法依照學生的需求, 增減資料 我希望能用幾年的時間,完成沒有版權問題,涵蓋恐龍本基本觀念,並以Linux為基礎的 作業系統簡介投影片 作業系統非常龐大,很多地方是我沒接觸過的、沒研究過的,因此投影片當中可能會有 不少錯誤
  • 3. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 3 前言: 這份投影片對讀者(學生)的設定如下 略懂資料結構、演算法 「真的」會寫程式 約略看懂組合語言 了解Linux system programming,例如基本的fork、pipe、signal等等 由於計算機結構是研究所的內容,因此相關的部分會在投影片內交代清楚 (大學部只修過計算機組織) 恐龍本中涵蓋,但不重要的部分我放在投影片最後面的「補充的名詞解釋」 這份投影片依然以介紹概念為主,與恐龍本不同的是以Linux為例介紹概念
  • 4. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 4 接下來的規劃 橋接恐龍書和Linux上,讓到業界的新鮮人可以透過這份投影片 快速了解整個Linux架構 更加模組化,教師可以選擇自己喜歡的部分,組成一個章節 每個章節都提供一個夠有代表性的實作 每個章節提供一系列的課後問題 提供更進階的部分
  • 5. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 5 課程大綱 DRAM在PC上的實體配置方式 記憶體的配置與使用 Fragmentation(記憶體碎裂問題) 50 percent rule(碎裂問題,將導致1/3記憶體無用) 考慮靜態系統,ARM Cortex-M的記憶體保護機制 現代處理器的記憶體管理(MMU)機制 在CPU中MMU與cache memory的相對位置 TLB miss與translation table structure 硬體方法 (天外飛來一筆)Linux中的memory layout (天外飛來一筆)share memory 軟體方法 完全解決external fragmentation問題了嗎?看看malloc! 討論
  • 6. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 6 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 7. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 7 X86的啟動 – BIOS的位置 x86的啟動時,執行的第一行程式碼一定是FFFF:0000,因此主 機板在焊電路的時候,必須使用address decoder將FFFF:0000 對應到BIOS的進入點 隨後經過一連串的軟硬體設定,進入作業系統的進入點,以 Linux為例,隨後進入start_kernel,開始作業系統主要的初始化
  • 8. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 8 BIOS對記憶體的使用 BIOS的資料不需要電力就可以保存 但BIOS的速度通常較DRAM要來慢 為什麼不用flash memory呢?因為flash memory是block device,而接 到CPU的「記憶型裝置」必須是byte addressable 大部分的BIOS會將自己複製到DRAM中,然後配置自己的code、 data section、stack section
  • 9. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 9 BIOS和RAM https://clipartpng.com/?741,computer-cpu-png-clipart http://chittagongit.com/icon/bios-icon-4.html http://www.pngmart.com/image/43960 address decoder FFFF:0000 FFFF:FFFF 共65K 除BIOS以外,其他 位址定址到DRAM 假設DRAM共4GB • 在這一個系統中,由於address decoder固定將 FFFF:0000~FFFF:FFFF映射到 BIOS • 因此我們無法存取主記憶體上的 FFFF:0000~FFFF:FFFF,共65K, 幸好問題不嚴重
  • 10. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 10 RAM和VRAM(GPU上面的RAM) address decoder 除BIOS以外,其他 位址定址到DRAM 假設DRAM共4GB https://www.deviantart.com/flava0ne/art/techPowerUp-GPU-Z-Icon- 640667776 假設顯示卡上面有 128MB的VRAM 32位元處理器, 最多定址4GB • 處理器只能定址4GB,但「裝 置+DRAM」就已經是 4.125GB • 怎麼辦?
  • 11. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 11 如果記憶體只有256MB或512MB的 memory layout https://resources.infosecinstitute.com/system-address-map- initialization-in-x86x64-architecture-part-1-pci-based-systems/#gref
  • 12. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 12 https://www.quora.com/Why-does-my-motherboard-see-only-3-25-GB- out-of-4-GB-RAM-installed-in-my-PC 如果DRAM是4GB • 由於PCI等裝置與DRAM 共用同一塊address space • 4GB扣除掉PCI等裝置所 使用的記憶體後,只剩下 3.25GB • 解決之道:邁向64位元 • 64位元不只可以解決記憶 體定址的問題,還可以解 決「檔案不能超過2GB」 的問題 4GB 可用記憶體 4096MB-750MB-20MB-1MB =3.25GB
  • 13. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 13 [ 0.000000] e820: BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable [ 0.000000] BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000059000-0x000000000009efff] usable [ 0.000000] BIOS-e820: [mem 0x000000000009f000-0x000000000009ffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x0000000031135fff] usable [ 0.000000] BIOS-e820: [mem 0x0000000031136000-0x0000000031136fff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x0000000031137000-0x0000000031180fff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000031181000-0x000000003a1a9fff] usable [ 0.000000] BIOS-e820: [mem 0x000000003a1aa000-0x000000003a4f4fff] reserved [ 0.000000] BIOS-e820: [mem 0x000000003a4f5000-0x000000003a530fff] ACPI data [ 0.000000] BIOS-e820: [mem 0x000000003a531000-0x000000003ae29fff] ACPI NVS [ 0.000000] BIOS-e820: [mem 0x000000003ae2a000-0x000000003b293fff] reserved [ 0.000000] BIOS-e820: [mem 0x000000003b294000-0x000000003b2fdfff] type 20 [ 0.000000] BIOS-e820: [mem 0x000000003b2fe000-0x000000003b2fefff] usable [ 0.000000] BIOS-e820: [mem 0x000000003b300000-0x000000003b3fffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fe000000-0x00000000fe010fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000008beffffff] usable 31,728MB 351KB 279KB 784MB 144MB 4KB OS lab伺服器 (Ubuntu 18.04 AMD64) • 使用「dmsg」看開機訊 息 • 實體記憶體為: • 32GB=32,768MB • BIOS分配以後為: • 31.9MB=32,656MB • 可以發現address decoder可以將DRAM映 射到不同的地方
  • 14. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 14 RAM和VRAM(GPU上面的RAM) address decoder 可以動態的將physical address映射到不同裝 置 DRAM共32GB https://www.deviantart.com/flava0ne/art/techPowerUp-GPU-Z-Icon- 640667776 假設顯示卡上面有 128MB的VRAM 64位元處理器, physical address space可達 248=256TB physical address 注意,是physical address
  • 15. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 15 [ 0.000000] Zone ranges: [ 0.000000] DMA [mem 0x0000000000001000-0x0000000000ffffff] [ 0.000000] DMA32 [mem 0x0000000001000000-0x00000000ffffffff] [ 0.000000] Normal [mem 0x0000000100000000-0x00000008beffffff] [ 0.000000] Device empty [ 0.000000] e820: [mem 0x40000000-0xdfffffff] available for PCI devices [ 0.000000] Kernel/User page tables isolation: enabled OS lab伺服器 (Ubuntu 18.04 AMD64) • DMA及DMA32分別是保 留給16/32位元的DMA controller使用 • normal,可以給任何能定 址64位元的裝置使用(例 如:CPU) 小常識,這個是為了要避免SPECTRE之類的 攻擊,讓kernel擁有自己的page table(後 面會介紹),這個「補丁」的缺點是「降低 system call」的效能 [ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000008beffffff] usable 第9頁
  • 16. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 16 00001000-00057fff : System RAM 00059000-0009efff : System RAM 00100000-31135fff : System RAM 31181000-3a1a9fff : System RAM 100000000-8beffffff : System RAM 6d7000000-6d7c031d0 : Kernel code 6d7c031d1-6d866a03f : Kernel data 6d88e2000-6d8b3dfff : Kernel bss 279KB 351KB 784MB 144MB 31,728MB OS lab伺服器 (Ubuntu 18.04 AMD64) • cat /proc/iomem • 這裡看到的是physical address 可以與地9頁交叉對照一下 第9頁
  • 17. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 17 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 18. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 18 關於DRAM的一些特性、使用 大部分的系統,只要CPU開始工作,DRAM就會全速運轉,即 使我們的系統上可能有多個DRAM插槽,這幾個DRAM被OS視 為一體 通常插滿記憶體,就是讓記憶體容量變大,頻寬變大,但OS無法獨立控 制各個記憶體(即:DIMM) 如果是NUMA架構,OS可以獨立控制。例如:AMD Threadripper是將 二顆CPU封裝在一起,二顆CPU各有自己的DRAM controller,因此對 OS、程式而言,分為remote和local二種不同記憶體,local速度比較快。 如果程式經過優化,可以將常用的擺在local不常用的擺在remote 如果沒有經過優化,那麼可以使用interleaving模式,獲得比較大的頻寬
  • 19. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 19 關於DRAM的一些特性、使用 記憶體用量比較低,省不了多少電 DRAM的讀取和寫入還是耗電,但耗電不會太多 將資料保存在記憶體必須耗電 如果某一個區段的記憶體沒有真正的用途,那麼還是得耗電保存這些 「算是garbage的記憶體的內容」 記憶體的主要用途 執行程式的時候使用(例如:執行excel需要記憶體) 當快取記憶體使用,主要是當HDD或SSD的快取記憶體 充當buffer使用,和週邊裝置溝通的時候,需要預留一塊記憶體,讓裝 置可以讀取或寫入資料(例如:DMA)
  • 20. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 20 OS lab伺服器 (Ubuntu 18.04 AMD64) 記憶體共有:32,826,708KB,31.3GB 沒有用到的記憶體有: 7,115,052KB,6.785GB 使用中的記憶體有: 470,464KB,0.449GB 被OS拿去當buffer或cache的有:25,241,192KB,24.07GB 由於記憶以不管使用或者不使用,都是耗電,因此OS會盡可能的將記憶體 用完,以OS Lab伺服器而言,大部分的記憶體作為cache,因此I/O效能變 得更好 類似像memory cleaner這樣的軟體,雖然會釋放記憶體,但可能會造成之 後的I/O效能變低。 KiB Mem : 32826708 total, 7115052 free, 470464 used, 25241192 buff/cache KiB Swap: 0 total, 0 free, 0 used. 31724376 avail Mem
  • 21. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 21 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 22. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 22 記憶體配置 1. OS找出APP所需要的記憶體 程式碼 (.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 通常稱之為.data 通常稱之為.bss
  • 23. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 23 記憶體配置 2. OS將執行檔複製到記憶體 http://chittagongit.com/icon/binary-file-icon-1.html 堆疊空間 複製 程式碼 (.txt) 未給初始值的全域變數 給初始值的全域變數
  • 24. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 24 記憶體配置 3. OS將為給初始值的部分給「0」 堆疊空間 程式碼 (.txt) 給初始值的全域變數 0000000 0000000 0000000 0000000 初始化 為0 未給初始值的全域變數
  • 25. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 25 記憶體配置 3. OS將為給初始值的部分給「0」 堆疊空間 程式碼 (.txt) 給初始值的全域變數 ret. addr int argc char** argv 初始化 堆疊 未給初始值的全域變數
  • 26. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 26 記憶體很大,CPU很快 可以同時載入多個程式 如右圖,同時載入「藍」「綠」「橘」 「黃」,四支程式 綠色程式所需要的記憶體最多,藍色的 最少 黑色虛線部分代表DRAM的大小 在這個例子中,「黃」的上面還有一部 分的空間沒用到 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 27. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 27 記憶體很大,CPU很快 可以同時載入多個程式 藍色執行結束 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 28. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 28 記憶體很大,CPU很快 可以同時載入多個程式 橘色執行結束 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 29. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 29 記憶體很大,CPU很快 可以同時載入多個程式 橘色執行結束 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 30. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 30 記憶體很大,CPU很快 可以同時載入多個程式 使用者想要執行一個大型程式,例如: photoshop 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數
  • 31. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 31 記憶體很大,CPU很快 可以同時載入多個程式 剩下空間是足夠的 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數
  • 32. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 32 記憶體很大,CPU很快 可以同時載入多個程式 但photoshop塞不進去任何一塊連續的 空間 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數 不夠🙅 🏻
  • 33. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 33 記憶體很大,CPU很快 可以同時載入多個程式 但photoshop塞不進去任何一塊連續的 空間 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數 不夠🙅 🏻
  • 34. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 34 記憶體很大,CPU很快 可以同時載入多個程式 但photoshop塞不進去任何一塊連續的 空間 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數 不夠🙅 🏻
  • 35. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 35 如果free space夠多 但無法滿足記憶體需求 如果free space夠多,但無法滿足現有的記 憶體需求,就稱之為「External fragmentation」 如果因為配置演算法,明明只需要X記憶體, 但卻分配了「X+ε」,多出來的「ε」稱之 為「internal fragmentation」 如右圖,如果OS覺得剩下的空間太小了, 沒辦法當作其他用途,而將剩下空間分配給 「黃」,那麼就是internal fragmentation 如果將這塊空間,分配給 「黃」,那麼這塊空間就是 internal fragmentation
  • 36. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 36 解決fragmentation 如果可以將「綠」往下搬動, 那麼就可以有足夠多的空間, 容納「紅」 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 37. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 37 解決fragmentation 如果可以將「綠」往下搬動, 那麼就可以有足夠多的空間, 容納「紅」 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數
  • 38. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 38 解決fragmentation 如果可以將「綠」往下搬動, 那麼就可以有足夠多的空間, 容納「紅」 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) Photoshop 給初始值的全域變數 未給初始值的全域變數
  • 39. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 39 「綠」如何往下移 首先「綠」要能夠搬動,也就是他所用的「定址方式」必須是 相對定址。 例如: regtarget = regbase + offset LD/ST regtarget offset regbase • 在上述例子中,只要改變regbase就可以改變這個程式的記憶體的位 址 這個是指令格式
  • 40. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 40 執行方式 為了增加擴充性,我們一次設 計三個「base register」,分 別是 basecode basedata basestack 由於我們一次增加三個暫存器, 因此應用程式可以放在不連續 的地方,code、data、stack可 以分開存放 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 41. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 41 執行方式 load R1, basedata, 100 load R2, basestack, 30 sub R3, R1, R2 comp R3, 0 jmp_ge basecode+150 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 42. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 42 搬移「綠」 由作業系統進行搬移 1. 首先將「綠」暫停執行 2. 將「綠」複製到指定位置 3. 重新設定base reg. file裡面各個暫 存器 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數
  • 43. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 43 搬移「綠」 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 load R1, basedata, 100 load R2, basestack, 30 sub R3, R1, R2 comp R3, 0 jmp_ge basecode+150 由於程式碼都是使用間接定址,因此只要修 改base reg. file後,原程式可以正確執行
  • 44. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 44 切換行程 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 如果我們想從「綠」切換到 「黃」,除了切換普通暫存器 以外,還需要切換base reg. file
  • 45. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 45 切換行程 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 如果我們想從「綠」切換到 「黃」,除了切換「普通暫存 器」(general registers)以外, 還需要切換base reg. file
  • 46. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 46 加入一些保護機制 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 為了預防程式碼寫錯,因此我 們依照各個segment的大小設 定limxxx 如果程式碼存取、執行錯誤的 記憶體,那麼會觸發 segmentation fault limstack limdata limcode
  • 47. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 47 加入一些保護機制 base reg. file basecode basedata basestack 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 limstack limdata limcode 👇🏻 load R1, basedata, 100 👇🏻 load R2, basestack, 30 👇🏻 sub R3, R1, R2 👇🏻 comp R3, 0 👉🏻 jmp_ge basecode+150000 Y https://tw.vector.me/browse/381954/tango_list_remove https://www.kisspng.com/png-error-fault-computer-icons-clip-art- cancel-button-794036/download-png.html N
  • 48. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 48 圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu 50 percent rule ⌾就算使用了一些最佳化的方法,external fragmentation依然是非常嚴重的問題 ⌾系統中不可以用的記憶體, 數量上是可 用記憶體的一半,故名之 ⌾1/3的記憶體無法使用!
  • 49. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 49 圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu 小結論 如果系統發生external fragmentation,可以藉由下列方式解 決 規定程式碼必須是「相對定址」 「搬移」程式 重新設定「base reg. file」 context switch的時候,除了切換general reg.以外還需要切換 「base reg. file」 加入了limXXX機制,確保同時執行多個程式時,程式之 間不會互相干擾
  • 50. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 50 圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu 小結論 記憶體搬移非常的耗費時間,浪費記憶體頻寬 如果程式碼所需要的記憶體變多,那麼需要找到一個新 的空間、搬移記憶體,再設定base reg. file。 如果這是一個標準的POSIX系統,那麼fork非常的耗費時間, 因為POSIX規定,parent和child必須是獨立的記憶體空間 雖然程式碼、變數、堆疊可以分開配置,但就程式碼而 言,程式碼必須連續配置。變數、堆疊也有同樣的問題。 如果程式的各個區段可以拆開來,分別配置,可以大幅 度地降低「記憶體搬移」的overhead。甚至不需要記憶體搬 移。
  • 51. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 51 圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu 小結論 如果是「靜態系統呢」 假設在系統建置的時候,我們就知道會有多少個程式,而且 程式的數量也不會變 在這樣的情況下,還有external fragmentation問題嗎? 如果沒有external fragmentation問題,那還需要記憶體搬移嗎? 如果沒有記憶體搬移,現在的記憶體管理架構是否夠用? 如果只需要記憶體保護機制,不需要記憶體管理機制 大致上只需要每個記憶體區塊「region」的base和limit 另外還需要描述每個「region」的讀、寫、執行的屬性
  • 52. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 52 ARM Cortex-M為例 MPU_RBAR 相當於base base [31:5] attr [4:0] MPU_RLAR 相當於limit limit [31:5] attr [4:0] • 開始位址「32:5」只用了28bits,CPU會自動在28bits後填入00000 b,因此,每一個region的 開始位址必須是32的倍數 • 並且每一個region的大小, CPU會自動在28bits後填入00000 b也必須是32的倍數 • 綠色部分都是描述該region的「屬性」,在此略過不談 長度共32bits
  • 53. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 53 base-limit reg. file ARM Cortex-M為例 base [31:5] attr [4:0] limit [31:5] attr [4:0] base [31:5] attr [4:0] limit [31:5] attr [4:0] base [31:5] attr [4:0] limit [31:5] attr [4:0] base [31:5] attr [4:0] limit [31:5] attr [4:0]
  • 54. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 54 ARM Cortex-M為例 base [31:5] attr [4:0] limit [31:5] attr [4:0] base [31:5] attr [4:0] limit [31:5] attr [4:0] base [31:5] attr [4:0] limit [31:5] attr [4:0] base [31:5] attr [4:0] limit [31:5] attr [4:0] 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 堆疊空間 程式碼(.txt) 給初始值的全域變數 未給初始值的全域變數 virtual addr. base-limit reg. file
  • 55. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 55 ARM Cortex-M為 例 https://community.arm.com/processors/trustzone-for-armv8-m/b/blog/posts/what-s-new-with-the-memory- protection-unit-mpu-in-cortex-m23-and-cortex-m33
  • 56. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 56 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 57. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 57 MMU在系統上的位置 address decoder 可以動態的將physical address映射到不同裝 置 https://www.iconspng.com/image/34779/mapping-table physical address 注意,是physical address MMU logical address 注意,是logical address 這裡所指的CPU及MMU通常會封裝在一起, 形成我們平常購買的「CPU」
  • 58. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 58 DRAM controller cache MMU core logical addr. phy. addr. 平常我們買的 「CPU」包含了 core、MMU、 cache、DRAM controller、PCIe controller 在這張圖中,core 送出的add.先經過 MMU再到cache。 在真實硬體上,通 常L1、L2 cache在 MMU之前,L3 cache在MMU之後
  • 59. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 59 DRAM controller cache MMU core logical addr. phy. addr. 平常我們買的 「CPU」包含了 core、MMU、 cache、DRAM controller、PCIe controller 為了解說上的方便, 我們假設core後面 緊接著MMU,之後 再接到cache
  • 60. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 60 以邏輯意義為基礎的MMU設計 在這個設計中,給予程式中的各個區段一個「映射表」,如下圖所示有stack、 data、code三個「映射」 如果每一個區段可以是任意大小,還是會有「找到連續空間,塞進去該區段」 的問題,換句話說,無法解決fragmentation問題 MMU logical addr. phy. addr. base reg. file basecode basedata basestack limstack limdata limcode
  • 61. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 61 新的MMU應該長成什麼樣子 管理的最小單位應該要更小,換句話說,要比code、data、 stack更小的管理單位 當MMU所管理的「記憶體單位」是任意大小時,會面臨嚴重的external fragmentation問題 如果MMU的「管理單位」是「夠小」且「固定大小」,那麼不 會有external fragmentation問題。 假設管理單位是「100KB」,應用程式是「500MB」 很明顯的找到5120個「100KB」比找到連續的「500MB」更容易 因此解決了external fragmentation,也讓尋找「足夠多」的空間變得更 容易
  • 62. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 62 新的MMU應該長成什麼樣子 「管理單位」是固定大小,那麼就必須分配給應用程式足夠大的 記憶體。 換句話說。我們會給出的記憶體是「管理單位」的倍數,而且比 應用程式還要來得大。 假設管理單位是「100KB」,應用程式是「500MB又30KB」 那麼我們必須找到5121個「100KB」,分配給該程式為「500MB又100KB」 100KB-30KB = 70KB,在這個例子中,internal fragmentation為70KB 假設程式共分3個不連續的邏輯區段,分別為code、data、stack,那麼 internal fragmentation的期望值為150KB 以這個例子而言, internal fragmentation只佔「150 ÷ 512000= 0.03%」
  • 63. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 63 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 64. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 64 新的MMU應該長成什麼樣子 經由上面的討論,我們決定了MMU的「管理單位」要「夠小」 且「固定大小」 由於電腦系統常常以2n為最小單位,在這裏我們將管理單位設定為4KB 為了避免external fragmentation問題,限制「管理單位」的開始位置一 定要是4KB的倍數、 將「管理單位」命名為memory page,簡稱「page」
  • 65. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 65 新的MMU應該長成什麼樣子 在過往,我們已basestack、basedata 、 basecode命名「管理單位」,address 為「basecode+150」 現在我們將「 basecode 」及「150」編碼到CPU送出的virtual address中 basecode :變成page number 「150」:變成offset 為了簡化細節、加強觀念的釐清,在這裡我們考慮32位元的處理器 因為每個page大小固定為4KB,因此不需要limstack、 limdata、limcode之類的欄位 page number offset 12bits 20bits
  • 66. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 66 看看新設計的MMU MMU logical addr. phy. addr. mapping TBL 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x234 0x444 • 先拿page number「0x234」去mapping TBL查表,得到其對應值為「0x8E0」 • offset直接複製到phy. addr. • 情況有點類似「basecode+150」的轉址, basecode會變,但150不會變 • 「150」相當於現在的「offset」,本例中offset為0x444 page number offset 0x8E0 0x444 http://fastraxpos.com/wp-content/uploads/revslider/bio/
  • 67. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 67 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x234 0x444 • 為了避免混淆,我們將還沒轉換前的address用<page, offset>表示,轉換後用 <frame, offset>表示 • 將mapping TBL,改命名為translation lookaside buffer(TLB) frame number offset 0x8E0 0x444 http://fastraxpos.com/wp-content/uploads/revslider/bio/ 看看新設計的MMU
  • 68. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 68 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x234 0x444 • 每當OS準備啟動一個行程時,OS必須將該行程所用到的記憶體的映射表格填入到TLB中 • Intel Sandy bridge的TLB數量 • Level 1 TLB(請注意,為了簡化,這裡的寫法不是很正確) • i-TLB:72 entries(程式碼用的TLB) • d-TLB:100 entries(資料用的TLB) • Level 2 TLB:1024 entries(如果L1 TLB找不到,可以到L2 TLB找) • 換句話說,程式碼+資料+堆疊 < 1024 × 4KB = 4MB frame number offset 0x8E0 0x444 http://fastraxpos.com/wp-content/uploads/revslider/bio/ https://stackoverflow.com/questions/40649655/how-is-the-size-of-tlb-in-intels- sandy-bridge-cpu-determined 看看新設計的MMU
  • 69. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 69 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x234 0x444 • 每當OS準備啟動一個行程時,OS必須將該行程所用到的記憶體的映射表格填入到 TLB中 • MIPS R8000-style的TLB數量 :384 entries • 換句話說,程式碼+資料+堆疊 < 384 × 4KB = 1,536KB frame number offset 0x8E0 0x444 http://fastraxpos.com/wp-content/uploads/revslider/bio/ https://stackoverflow.com/questions/40649655/how-is-the-size-of-tlb-in-intels- sandy-bridge-cpu-determined 看看新設計的MMU
  • 70. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 70 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x234 0x444 • TLB的數量,限制了程式的大小 • x86架構下,程式碼+資料+堆疊 < 1024 × 4KB = 4MB • MIPS架構下,程式碼+資料+堆疊 < 384 × 4KB = 1,536KB • 解決之道 • 增加TLB數量 • 動態載入TLB frame number offset 0x8E0 0x444 http://fastraxpos.com/wp-content/uploads/revslider/bio/ https://stackoverflow.com/questions/40649655/how-is-the-size-of-tlb-in-intels- sandy-bridge-cpu-determined 看看新設計的MMU
  • 71. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 71 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 72. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 72 增加TLB數量 TLB基本上是一個「平行搜尋」的硬體 意即page number會同時和數十個到數百個TLB entries做比較, 如果擴充TLB會增加硬體成本 這裡的硬體成本可能為:電晶體數量、時脈降低、耗電等等
  • 73. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 73 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0
  • 74. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 74 增加page size(frame size) 增加page size是個好主意,但page size越大,軟體在管理上的 彈性就越小(這下一個章節virtual memory會討論) 各種處理器幾乎都有「huge page的選項」 X86-64為例,有下列選項 4K, 2M and 1G (or 64K and 512M if one builds their own kernel with CONFIG_ARM64_64K_PAGES=y) Linux可以使用mmap配置記憶體,具有「MAP_HUGETLB」選 項
  • 75. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 75 TLB夠用嗎? ITLB 4 KiB page translations: 128 entries; 8-way set associative dynamic partitioning 2 MiB / 4 MiB page translations: 8 entries per thread; fully associative Duplicated for each thread DTLB 4 KiB page translations: 64 entries; 4-way set associative fixed partition 2 MiB / 4 MiB page translations: 32 entries; 4-way set associative fixed partition 1G page translations: 4 entries; 4-way set associative fixed partition
  • 76. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 76 TLB夠用嗎? STLB 4 KiB + 2 MiB page translations: 1536 entries; 12-way set associative. 1 GiB page translations: 16 entries; 4-way set associative fixed partition
  • 77. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 77 動態載入TLB entries 當MMU發現某一個記憶體位址的page number在TLB找不到對 應的entries時,可以觸發某種機制,將當下要用的TLB載入 記憶體很大,可以將所有的映射表存放在主記憶體中 但,硬體做?軟體做?
  • 78. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 78 硬體來做好嗎?該如何做呢? 假設應用程式的大小是500MB,而且這個程式的所有「部分」 (例如:程式碼、資料、堆疊等等 )都是緊貼在一起的。 在這樣的情況下,需要多大的空間儲存mapping table(正式用 語是:page table)呢? 500MB/4KB = 128,000 entries 每個entries至少要22bits,處理器的最小存取單位是8bits,因此我們讓 每個entry使用32bits(32 是 2n存取比較有效率) 共128,000 × 4B = 512,000B = 500K 我們需要找到「連續的500K」的可用記憶體
  • 79. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 79 硬體來做好嗎?該如何做呢? 回到老問題,假設有下面幾個應用程式,大小分別如下 500MB的應用程式,要找到「連續的500K」的可用記憶體放page table 700MB的應用程式,要找到「連續的700K」的可用記憶體放page table 650MB的應用程式,要找到「連續的650K」的可用記憶體放page table 1500MB的應用程式,要找到「連續的1500K」的可用記憶體放page table 要找到「連續的500K」、「再找到連續的700K」、「再找到連續的 650K」、「再找到連續的1,500K」…「再找到連續的…」…「再找到連 續的…」 這些程式會動態生成,也會消失。久而久之會造成external fragmentation問題 paging本來是用來解決fragmentation,但自己也遭受fragmentation
  • 80. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 80 4KB 1024 entries ✅ 第一層table最多可以有1024個entries ✅ 因此第二層最多有1024個table,每個第二層table最多1024 個entries ✅ 所以到第二層最多可以有1024 × 1024 = 1M 個entries ✅ 注意:第一層的page table entry(PTE)可以是NULL,不 指向table 第一層 page table 第二層 page table 硬體來做好嗎? 對「page table structure」再paging 為了避免用語上的混淆 ✳ 整個在記憶體上,將virtual addr.轉成phy. addr.的資料結 構稱之為「page table structure」 ✳ 必須放在連續記憶體區塊的的資料結構,稱之為page table
  • 81. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 81 硬體來做好嗎? 該如何做呢? 4KB 1024 entries 第一層 page table 第二層 page table data pages � 第二層最多1M個entries � 因此最多可以有1M個data block � 每個data block的大小為4K � 因此最多可以定址4GB的記憶體 � 注意:第二層的PTE也可以是 NULL 附註:硬體不是填上NULL, 這樣太耗時了,實際上是設定 invalid bit
  • 82. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 82 圖片來源:https://www.hiclipart.com/free-transparent-background-png-clipart-dwxzu 注意到了嗎? 對page table進行paging以後,所有的「分配單位」,包 含:page table、data page的大小都4K,對OS來說,所有的 「分配單位」大小一樣,都對齊4K的倍數,徹底解決 external fragmentation問題 以我們的例子來說,32位元的CPU,logical address是32bits, 但page table entry只用了20個位元(因為對齊4K,後面12位 元不論值是什麼,MMU視而不見,MMU只看page number) 還剩下12個位元沒用到,這些位元在下個章節會被用 來描述「page的屬性」 https://no.m.wikipedia.org/wiki/Fil:Emblem-notice.svg
  • 83. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 83 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 84. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 84 位址的表示方式 page number offset 12bits 20bits LV2 PTE # offset 12bits 10bits LV1 PTE # 10bits 原本的表 示方式 將page table再 paging
  • 85. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 85 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x3,6 0x444 offset 0x??? 0x444 3 PTBR 6 0xEE0 1. 在TLB找不 到0x3,6 frame number
  • 86. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 86 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x3,6 0x444 offset 0x??? 0x444 3 PTBR 6 0xEE0 2. 觸發CPU走訪page table 3. CPU先使用PTBR找到第一層page table 1. 在TLB找不 到0x3,6 frame number
  • 87. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 87 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x3,6 0x444 offset 0x??? 0x444 3 PTBR 6 0xEE0 2. 觸發CPU走訪page table 3. CPU先使用PTBR找到第一層page table 1. 在TLB找不 到0x3,6 4. 從第一層page table的第三個entry找 到第二層page table的開始位址 frame number
  • 88. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 88 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x234 0x8E0 0x456 0xFE0 page number offset 0x3,6 0x444 offset 0x??? 0x444 3 PTBR 6 0xEE0 2. 觸發CPU走訪page table 3. CPU先使用PTBR找到第一層page table 1. 在TLB找不 到0x3,6 4. 從第一層page table的第三個entry找 到第二層page table的開始位址 5. 找到frame number = 0xEE0 因此0x3,6 ⇒ 0xEE0 frame number
  • 89. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 89 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x3,6 0xEE0 0x456 0xFE0 page number offset 0x3,6 0x444 offset 0x??? 0x444 3 PTBR 6 0xEE0 2. 觸發CPU走訪page table 3. CPU先使用PTBR找到第一層page table 1. 在TLB找不 到0x3,6 4. 從第一層page table的第三個entry找 到第二層page table的開始位址 5. 找到frame number = 0xEE0 因此0x3,6 ⇒ 0xEE0 6. 找一個TLB entry, 將其置換成 0x3,6 ⇒ 0xEE0 frame number
  • 90. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 90 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x3,6 0xEE0 0x456 0xFE0 page number offset 0x3,6 0x444 frame number offset 0x??? 0x444 3 PTBR 6 0xEE0 2. 觸發CPU走訪page table 3. CPU先使用PTBR找到第一層page table 1. 在TLB找不 到0x3,6 5. 找到frame number = 0xEE0 因此0x3,6 ⇒ 0xEE0 6. 找一個TLB entry, 將其置換成 0x3,6 ⇒ 0xEE0 4. 從第一層page table的第三個entry找 到第二層page table的開始位址
  • 91. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 91 MMU logical addr. phy. addr. TLB 0x100 0x200 0x102 0x423 0x212 0x440 0x3,6 0xEE0 0x456 0xFE0 page number offset 0x3,6 0x444 frame number offset 0xEE0 0x444 3 PTBR 6 0xEE0 2. 觸發CPU走訪page table 3. CPU先使用PTBR找到第一層page table 1. 在TLB找不 到0x3,6 5. 找到frame number = 0xEE0 因此0x3,6 ⇒ 0xEE0 6. 找一個TLB entry, 將其置換成 0x3,6 ⇒ 0xEE0 8. 0x3,6 ⇒ 0xEE0 4. 從第一層page table的第三個entry找 到第二層page table的開始位址
  • 92. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 92 MMU的轉換 在系統上的位置 address decoder 可以動態的將physical address映射到不同裝 置 0xEE0,444 注意,是physical address MMU 0x3,6,444 注意,是logical address
  • 93. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 93 context-switch MMU logical addr. phy. addr. TLB 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? page table structure page table structure page table structure page table structure PTBR
  • 94. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 94 context-switch MMU logical addr. phy. addr. TLB 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? page table structure page table structure page table structure page table structure PTBR
  • 95. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 95 context-switch MMU logical addr. phy. addr. TLB 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? page table structure page table structure page table structure page table structure PTBR
  • 96. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 96 context-switch MMU logical addr. phy. addr. TLB 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? 0x??? page table structure page table structure page table structure page table structure PTBR
  • 97. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 97 背景圖來源: https://www.wallsauce.com/eu/designer-wallpaper- murals/natural-history-museum-dinosaurs-pattern-wall- mural 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 98. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 98 Linux中task的 memory layout .txt .data heap stack kernel 128TB 128TB https://www.homecourt.ai/media-logos/
  • 99. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 99 .txt .data heap stack kernel 8EB 8EB Linux中task的 memory layout 1 Terabyte (TB) = 1024 GB 1 Petabyte (PB) = 1024 TB 1 Exabyte (EB) = 1024 PB
  • 100. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 100 Linux中task的 memory layout DRAM .txt .data heap stack kernel � 注意:右圖並沒有按照比例 � 將所有的DRAM映射到kernel space, kernel space高達128GB,因此可以將 DRAM可以完全映射到kernel space � 在user space方面,通常記憶體需求量 遠低於128GB � 根據user space真正的需求配置DRAM
  • 101. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 101 Linux中task的 memory layout stack heap .data .txt DRAM .txt .data heap stack kernel � 注意:右圖並沒有按照比例 � 將所有的DRAM映射到kernel space, kernel space高達128GB,因此可以將 DRAM可以完全映射到kernel space � 在user space方面,通常記憶體需求量 遠低於128GB � 根據user space真正的需求配置DRAM � 如右圖,我們假設.txt、.data、heap、 stack都剛好是一個page
  • 102. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 102 Linux中task的 memory layout heap heap stack .txt .data heap stack .data .txt DRAM .txt .data heap stack kernel � 注意:右圖並沒有按照比例 � 將所有的DRAM映射到kernel space, kernel space高達128GB,因此可以將 DRAM可以完全映射到kernel space � 在user space方面,通常記憶體需求量 遠低於128GB � 根據user space真正的需求配置DRAM � 如右圖,我們假設.txt、.data、heap、 stack都剛好是一個page � 假設從「藍」切換「綠」,並且「綠」 的heap比較大,佔了2個page
  • 103. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 103 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 104. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 104 考慮 共用記憶體 heap heap stack .txt .data shared heap stack .data .txt DRAM .txt .data heap stack kernel � 「綠」和「藍」共用黃色記憶體,執行 綠色時,圖示如右 shared
  • 105. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 105 heap heap stack .txt .data shared heap stack .data .txt DRAM stack kernel .txt .data heap shared 考慮 共用記憶體 � 「綠」和「藍」共用黃色記憶體,執行 綠色時,圖示如右
  • 106. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 106 關於cache DRAM controller cache MMU core logical addr. phy. addr. � 在這份投影片,假設MMU是在cache之前,因 此送到cache全部都是phy. addr.(如右圖) � 但在真實處理器,MMU的速度比較慢,會拉 長latency,因此很多處理器把L1$、L2$放在 MMU之前 � 如果cache在MMU之前稱之為virtual cache, 有數種方法可以解決 � 將cache中的資料全部清楚 � 加入ASID,這作業系統指定的一個數字, 不同於pid,<ASID, logical addr.>構成唯 一位址 � Virtually Indexed Physically Tagged,計算 機組織會介紹這個技巧,對OS來說可以看 成是phy. cache http://wikiclipart.com/eraser-clip-art_33317/
  • 107. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 107 TLB Miss的軟體解決方法 MIPS處理器使用了software-managed TLB,當TLB miss時將觸 發exception將由OS kernel進行後續處理 Three types of TLB exceptions can occur: TLB Refill occurs when there is no TLB entry that matches an attempted reference to a mapped address space. TLB Invalid occurs when a virtual address reference matches a TLB entry that is marked invalid. TLB Modified occurs when a store operation virtual address reference to memory matches a TLB entry which is marked valid but is not dirty (the entry is not writable). https://www.manualslib.com/manual/596187/Mips-Technologies-R4000.html?page=158#manual
  • 108. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 108 TLB Miss的軟體解決方法 以TLB Refill為例,MIPS會告訴kernel到底發生「錯誤的原因」 及「錯誤發生的位址」 OS kernel可以依照「原因」及「位址」,並根據當時CPU正在執行哪一 個task,使用任何適當的演算法找出 所謂的「真的錯誤」,意即程式碼本身有問題,例如:指標用錯 另一種可能是OS未將該程式所需要的TLB entry放入TLB中 OS kernel可以使用「paged page table」,存放該程式的page table structure,或者可以使用hash,更快速的找到「映射」。 或許可以同時載入多個TLB entries(例如:OS很肯定某些page 會一起使用)。
  • 109. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 109 TLB Miss的軟體解決方法 優點: 透過軟體,可以做更有效的搜尋,甚至修改搜尋演算法 可以加入更智能的功能,將未來「也可能造成TLB miss」的「映射」放 入TLB中 缺點: exception牽涉到「mode change」需要耗費一些時間 部分的MIPS型號內建硬體機制自動走訪page table 部分SPARC、POWER處理器允許使用軟體處理TLB miss
  • 110. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 110 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com
  • 111. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 111 配置記憶體的真實情況 大部分的應用程式,配置記憶體時,大小幾乎都不等於4K的倍 數 但作業系統透過硬體能夠解決的是「4K page」的 fragmentation問題,因此我們還需要一些軟體方法解決「隨意 大小」配置問題 上述問題同時存在於「user task」與「kernel task」,在本小節 中分別進行討論
  • 112. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 112 作業系統的記憶體分配架構 kernel space user space 1. 這代表系統中所有的frame,例如 4GB,就有1M個frame,我們首先解 決frame分配的問題 2. kernel library,提 供kmalloc,給 kernel task使用 3. libc,提供malloc等 函數給user task使 用 接下來我們分別對下列議題進行討論 1. kernel如何分配frame 🏻🏻♀️→🙋🏻♀️ 2. kernel如何實現kmalloc 3. libc如何實現malloc
  • 113. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 113 1. kernel對frame的管理 如下圖,kernel透過MMU的協助,將記憶體視為大小為4K的 page進行管理 kernel將所有的DRAM映射到kernel space中,因此kernel可以 直接存取任何記憶體。即便kernel已經將這塊記憶體分配給user task了,kernel還是可以存取該塊記憶體 因此kernel內部必須小心的處理所有的記憶體,記憶體幾乎是赤 裸裸的供給kernel使用 1. 這代表系統中所有的frame,例如 4GB,就有1M個frame,我們首先解 決frame分配的問題
  • 114. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 114 1. kernel對frame的管理 過去Linux kernel將記憶體設定為全部都可以讀、寫、執行,新 的Linux kernel依照「該page」的使用方式,設定讀、寫、執行 等屬性,以增加系統安全性 如果Linux kernel將一個page配置給user space,那麼這個page 最少會有二個virtual address。MMU將該frame映射到kernel space及user space kernel初始化時,就將所有的RAM映射到kernel space 當user task需要記憶體時,kernel可以將該frame映射到user space
  • 115. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 115 複習 右圖中,shared有 三個virtual address, 分別屬於「綠」、 「藍」及kernel 藍色的部分則有二 個virtual address, 分別屬於「藍」、 kernel 綠色的部分則有二 個virtual address, 分別屬於「綠」、 kernel DRAM .txt .data heap stack kernel space .txt .data heap stack kernel space heap heap stack .txt .data shared heap stack .data .txt shared shared 藍的addr. space 綠的addr. space
  • 116. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 116 1. kernel對frame的管理 如下圖,kernel將所有的記憶體映射到kernel space,由於 kernel使用軟體方法管理記憶體,因此使用huge page將記憶體 映射到kernel space 例如:在一台具有32GB記憶體的x86-64上,只需要32個huge TLB就可 以將32GB完整的映射到kernel space(註:x86-64的huge page可達 1GB) 因為核心使用huge TLB,因此只能靠軟體技術管理記憶體 huge TLB帶來非常大的效能改善,Intel Sandy bridge的TLB數量為1024 個,在這個例子中,核心只用掉32個TLB entries
  • 117. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 117 1. kernel對frame的管理 如下圖,kernel將所有的記憶體映射到kernel space,因此 kernel必須知道哪些frame已經分配出去了,哪些frame是free的 當記憶體釋放回kernel時(即:變為free frame),必須能快速 的合併free frame成為更大塊的free frame,避免fragmentation 在下圖中,藍色的部分代表已經分配出去的frame,白色的部分 代表free frame
  • 118. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 118 1. kernel對frame的管理-buddy system 假設系統中共有32個frame,下圖展示了Linux如何管理這32個frame。 經過一連串的配置、釋放記憶體後,產生了一些fragmentation,Linux並無 法完全解決fragmentation,但透過buddy system減輕fragmentation問題 2 2 4 4 4 4 4 2 2 4 4 8 8 8 4 8 16 16 32
  • 119. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 119 1. kernel對frame的管理-buddy system 下圖中,淺黃和深黃雖然相鄰,但不能合併,因為他們不是buddy buddy的充分必要條件是「來自同一個父母」 深黃的父母是A,淺黃的父母是B,因此無法合併 2 2 4 4 4 4 4 2 2 4 4 8 8 8 4 8 16 16 32 B A
  • 120. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 120 1. kernel對frame的管理-buddy system 假設某個kernel task釋放「頭二個frame」(即:橘紅),那麼 橘紅和淺黃可以合併,因為他們的父母都是A 2 2 4 4 4 4 4 2 2 4 4 8 8 8 4 8 16 16 32 B A
  • 121. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 121 1. kernel對frame的管理-buddy system 假設某個kernel task釋放「頭二個frame」,那麼 橘紅和淺黃可以合併,因為他們的父母都是A 2 4 4 4 4 4 4 2 2 4 8 8 8 4 8 16 16 32 B
  • 122. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 122 1. kernel對frame的管理-buddy system 假設某個kernel task釋放「頭二個frame」,那麼 橘紅和淺黃可以合併,因為他們的父母都是A 淺黃和深黃又可以合併,因為他們的父母都是B 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32
  • 123. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 123 1. kernel對frame的管理-buddy system 假設某個kernel task釋放「頭二個frame」,那麼 橘紅和淺黃可以合併,因為他們的父母都是A 淺黃和深黃又可以合併,因為他們的父母都是B 因此,釋放掉「橘紅」以後,觸發一連串的合併,最後得到連續的8個free frame 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32
  • 124. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 124 1. kernel對frame的管理-buddy system 假設某個kernel task需要2個pages,kernel將「淡綠」配置出去 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32
  • 125. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 125 1. kernel對frame的管理-buddy system 假設某個kernel task需要2個pages,kernel將「淡綠」配置出去 又有一個kernel task需要2的page,但目前最小的free memory為「連續4個frame」 考慮「紫」 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32
  • 126. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 126 1. kernel對frame的管理-buddy system 假設某個kernel task需要2個pages,kernel將「淡綠」配置出去 又有一個kernel task需要2的page,但目前最小的free memory為「連續4個frame」 考慮「紫」 將「紫」拆成二個,分別是「淡紫」和「深紫」 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32 4 4
  • 127. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 127 1. kernel對frame的管理-buddy system 假設某個kernel task需要2個pages,kernel將「淡綠」配置出去 又有一個kernel task需要2的page,但目前最小的free memory為「連續4個frame」 考慮「紫」 將「紫」拆成二個,分別是「淡紫」和「深紫」 kernel將「深紫」分配出去 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32 4 4
  • 128. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 128 1. kernel對frame的管理-buddy system 配置二個,又配置二個以後,系統最後的樣貌如下圖 buddy system的重點 如果需要分割,必須「對稱」分割 如果相鄰的二個free frames需要合併,則他們必須源自於同一個父母 2 8 4 4 4 4 2 2 4 8 8 4 8 16 16 32 4 4
  • 129. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 129 作業系統的記憶體分配架構 kernel space user space 1. 這代表系統中所有的frame,例如 4GB,就有1M個frame,我們首先解 決frame分配的問題 2. kernel library,提 供kmalloc,給 kernel task使用 3. libc,提供malloc等 函數給user task使 用 接下來我們分別對下列議題進行討論 1. kernel如何分配frame 2. kernel如何實現kmalloc 🏻🏻♀️→🙋🏻♀️ 3. libc如何實現malloc
  • 130. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 130 Slab Allocator (注意,恐龍本有slab) When cache created, filled with objects marked as free When structures stored, objects marked as used If slab is full of used objects, next object allocated from empty slab If no empty slabs, new slab allocated Benefits include no fragmentation, fast memory request satisfaction
  • 131. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 131 Slab Allocation https://medium.com/hungys-blog/linux-kernel-memory- management-f2824ab7e66
  • 132. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 132 Slab Allocation https://medium.com/hungys-blog/linux-kernel-memory- management-f2824ab7e66
  • 133. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 133 Slab Allocation kmem_ cache (16B) kmem_ cache (32B) kmem_ cache (64B)
  • 134. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 134 Slab Allocation used used used used used used used used kmem_ cache (16B) kmem_ cache (32B) kmem_ cache (64B) slab full
  • 135. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 135 Slab Allocation used used used used used used used used kmem_ cache (16B) used used used used slab full slab partial slab free
  • 136. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 136 作業系統的記憶體分配架構 kernel space user space 1. 這代表系統中所有的frame,例如 4GB,就有1M個frame,我們首先解 決frame分配的問題 2. kernel library,提 供kmalloc,給 kernel task使用 3. libc,提供malloc等 函數給user task使 用 接下來我們分別對下列議題進行討論 1. kernel如何分配frame 2. kernel如何實現kmalloc 3. libc如何實現malloc🏻🏻♀️→🙋🏻♀️
  • 137. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 137 malloc的位置 如左圖,標準的應用程式具有 heap,而malloc「幾乎」都是 從heap中找尋「閒置」的記憶 體 heap是連續配置的記憶體空間, 大小為4K的倍數 應用程式使用的記憶體往往不 等於4K的倍數 當我們呼叫malloc時,必須要 有適當的演算法,讓我們從 heap中找到所需的記憶體 heap heap stack .txt .data heap stack .data .txt DRAM stack kernel .txt .data heap
  • 138. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 138 問題:為什麼不要用mmap mmap的功能是一次向OS kernel要數個page大小的記憶體(通 常是4K的倍數) malloc所需要的記憶體常常不跟4K扯不上任何關係 mmap是一個耗時的system call,為了安全性的原因,mmap所 得到的page都填入了0 如果沒有填進0會怎樣?會不會看到別的process的資料呢? heap裡面的資料是重複使用的,因為heap的資料都隸屬於同一 個process,就算看到「之前的資料」,那麼舊資料也屬於同一 個process,因此不用保護隱私,換句話說,就是不用填0
  • 139. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 139 heap的資料結構(ptmalloc) https://jipanyang.wordpress.com/2014/06/09/glibc-malloc-internal-arena-bin-chunk- and-sub-heap-1/
  • 140. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 140 關於ptmalloc演算法 可以參考底下資料 https://goo.gl/ALHVoh 作者是:华庭(庄明强) 這篇文章的優點是除了解釋程式碼以外,也解釋了為什麼要這樣做 只用了126頁就將pmalloc解釋得很清楚 底下這個網頁也介紹了malloc的演算法 https://sourceware.org/glibc/wiki/MallocInternals 這個網頁解釋的比較模糊 請同學們自行學習
  • 141. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 141 關於ptmalloc演算法 ptmalloc和「恐龍本」比較有關係的是「可用空間的選用」 first fit,找到第一個「可用空間」時就塞進去,恐龍本建議的方法 best fit,找到可以塞進去的「可用空間」中,最小的那一個,塞進去。 ptmalloc管理大型「可用空間」所採用的方法 worst fit,找到最大的空間塞進去。這個方法可以留下最多剩餘空間
  • 142. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 142 章節結論 在本章節,如果系統屬於靜態系統,並沒有「動態配置記憶體」 問題時,使用簡單的memory protection unit是個不錯的方法 MPU只能做記憶體映射、記憶體屬性設定 使用MPU的情況下,如果需要「調動記憶體配置」,MPU管理的記憶體 單位太大,大小不定,會有「fragmentation」和「memory copy overhead」 如果是動態系統,paging是比較好的方法 「page」大小一致,且對齊「page的大小」的倍數,雖然會有internal fragmentation,但page夠小, internal fragmentation問題不大 對應表存在於MMU中的TLB,TLB的數量通常小於數千個entries 為了解決TLB數量有限的問題,必須使用軟體或者硬體方法動態載入當下 所需的TLB
  • 143. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 143 章節結論 硬體方法 由MMU直接存取在主記憶體的「translation translation structure」,例如: 「page structure」。這個表格由OS kernel設定,讓MMU讀取的資料結構 優點是:TLB miss時不會觸發exception,減少切換到「TLB miss handler」的 overhead, 缺點是:很難用更好的演算法改善TLB的hit ratio 軟體方法 TLB miss時,MMU觸發exception通知處理器,由OS kernel處理這個問題 優點是:可以使用各式的資料結構予以優化,而且可以依照使用情境同時載入 多個TLB entries,減少miss ratio。缺點是:由正常的軟體執行程序切換到 exception handler,這個程序的overhead較硬體大。
  • 144. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 144 章節結論 使用了MMU是否可以完全解決external fragmentation的問題 kernel如何分配page kernel如何分配小塊記憶體 user space,尤其是libc如何分配記憶體 額外值得一提的是kernel在處理page的時候會發生「internal fragmentation」問題嗎? 由於核心的virtual memory和DRAM是「one-to-one mapping」,勢必 會發生「free page」,不連續的問題 該如何解決?vmalloc
  • 145. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 145 章節結論 – 進一步的推想 使用了MMU是否可以完全解決external fragmentation的問題 kernel如何分配page kernel如何分配小塊記憶體 user space,尤其是libc如何分配記憶體 額外值得一提的是kernel在處理page的時候會發生「internal fragmentation」問題嗎? 由於核心的virtual memory和DRAM是「one-to-one mapping」,勢必 會發生「free page」,不連續的問題 假設核心需要4M的連續記憶體,共要1K個page,系統中存在足夠多的 free page,但這些page不連續。該如何解決?vmalloc
  • 146. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 146 章節結論 - 進一步的推想 kernel以使用MMU(kernel是否只能使用MMU存取主記憶體與 硬體架構相關,x86及ARM的Linux使用MMU) 週邊裝置,例如PCI使用的是physical memory addressing kernel如何控制週邊裝置? kernel知道哪一部分的linear memory對應到哪一部分的physical memory 例如:kernel要寫入實體位置100MB的位置,那就找出哪一個linear address對應到 該實體位置
  • 147. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 147 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 解釋base register和limit register(於MPU中有這一段討論) 討論address binding的方式 這部分恐龍書有討論,包含了 compile time,直接產生「執行時期」的address,用於DOS時代 DOS主要的存活期間:從1981年直到1995年的15年間 同學們大約出生於1997年,但相對於「恐龍」存活於「2億3千萬年」,DOS算是 modern operating system linkage editor 將靜態函數或者自己寫的其他函數庫編譯進去 loader 將程式碼放到「作業系統、linker」指定的位置,目前Linux都是採用相對位置,因此可 以載入到任意位置,也可以使用「ASLR」 execution time,使用MPU或MMU進行記憶體轉換 使用硬體做logical address到physical address的轉換 執行時期,OS可以調動process的位置,稱之為page migration
  • 148. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 148 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 什麼是dynamic loading (重要,研究所) 執行時期將函數庫或者所需要的程式碼載入 可以由作業系統支援,也可以由應用程式自行支援 例如:很多遊戲,必須使用dynamic loading,在「換關」的時候載入哪 一個關卡所需要的資料、程式碼等等 什麼是dynamic linking (重要,研究所) 執行時期將「共用函數庫」載入 同一個「共用函數庫」在記憶體中只會存在一份,例如:Linux中只存在 一份libc 需要作業系統支援。因為只有作業系統知道哪些動態函數庫已經在記憶 體了。如果是,那麼只要做link就好,不需要載入
  • 149. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 149 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 swapping,請注意「恐龍書」的swapping是,暫停應用程式, 並且將整個APP寫出到secondary storage 大部分來說,swap指的是對某些page暫時寫出到secondary storage, 這一部分下個章節討論 如果一個process執行read(fd, &buf, size),那麼OS會將資料寫 入到&buf中,但如果這個process被swap out,OS該怎麼辦? (重要,研究所) 不允許正在進行I/O的process被swap out OS暫時將資料存在OS kernel中,等這個process被swap in時,再將資料 寫到該buffer(「恐龍書」說:這個方法需要額外的記憶體複製,實際 的情況同學們可以自行思考一下)
  • 150. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 150 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 iOS支援swapping,當一個APP在background時,iOS會回收這 個APP的大部分記憶體。 如果是修改過的記憶體,那麼iOS會保留在RAM中 Android在記憶體不足時,會terminate某些process 這些process的狀態(例如:stack、heap等「dirty」 pages)保存在 flash memory中,等待下次啟動回到上次的狀態 其實這個方法同iOS 但Android在排程演算法上是「真多功」,iOS是「智慧型多工」(或者 稱之為假多工),後者比較省電
  • 151. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 151 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 memory allocation:partition方法 將記憶體切割成大小相等的partition,每個process佔用數個partition 早期的ARM使用這個方法,每個應用程式具有64個32MB的位址空間 在這個時期,WinCE(~WinCE 5.0,2004年)最多執行32個應用程 什麼是first fit、best fit、worst fit(重要,研究所) 什麼是external fragmentation、internal fragmentation(重要, 研究所) 什麼是50-percent rule(重要,研究所)
  • 152. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 152 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 什麼是segmentation,請參考MPU的說明(重要,研究所) OS使用「frame table」紀錄page的使用情況,例如是否分出 去了?分配給誰? 什麼是TLB(重要,研究所) 什麼是TLB miss(重要,研究所) 切換行程時TLB要怎樣處理?(重要,研究所) flush ASID
  • 153. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 153 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 計算effective memory-access time(重要,研究所) TLB_hit_ratio × access_timeTLB_hit + (1- TLB_hit_ratio) × access_timeTLB_miss protection,在這個章節只介紹valid-invalid bit,相當於投影片 中的「NULL指標」的意思。什麼是valid-invalid bit 什麼是shared page 什麼是page table structure(請參考投影片中的TLB miss與 translation table structure中的「硬體方法」)(重要,研究所)
  • 154. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 154 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 hashed page table (重要,研究所) 將virtual address拿去做hash,得到一個hash value,再拿這個hash value到hash table去查詢該virtual address對應到哪一個physical address inverted page table(重要,研究所) 系統中只有一個page table 將<process-id, page number>到該page table逐一比對,如果在第「i」 個比對到,那麼這個page就是對應到第「i」個frame 「恐龍書」稍微介紹了SPARC,寫得沒有很清楚,但似乎是 「software-managed TLB」
  • 155. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 155 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 IA-32的記憶體管理 先用segmentation unit(結構類似投影片中的MPU)將logical address 轉成linear address 再用paging unit(結構類似於投影片中的MMU中的hardware management TLB)將physical address轉成physical address page有二種size分別是4MB page及4KB page 如果第一層page table直接指向的data page就是4MB page 如果是第二層page table指向的data page就是4KB page 使用CR3暫存器指向第一層page table
  • 156. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 156 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 目前x86-64的實際定址空間為248 48~63 bits的值與第47bit的值相同 page table分成四層 附註:在我們的投影片中,將轉換的整個資料結構稱之為「page table structure」,而每層的轉換表稱之為「Xth page table」 x86-64將各層page table分別命名為「page map level 4」、「page directory pointer table」、「page directory」、「page table」 支援4KB、2MB、1GB的data page
  • 157. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 157 Quiz 注意,這裡列出來的問題都是恐龍書有的內容 ARM的page轉換 與投影片幾乎一樣 第一層的page table可以指向1MB或16MB的page 第二層的page table可以指向4KB或16KB的page
  • 158. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 158 填寫學校問卷 https://miswww1.ccu.edu.tw/evaluation/001.php https://goo.gl/iM8BS1 https://goo.gl/QP1ZRe 可以的話,請將大家的意見複製到這裡
  • 159. 創作共用-姓名 標示-非商業性-相同方式分享 CC-BY-NC-SA 中正大學 – 羅習五 159 作業系統概論基於GNU/Linux 中正大學,資工系,作業系統實驗室,副教授 羅習五,shiwulo@gmail.com