---
# System prepended metadata

title: NCTU OSDI Dicussion - Memory Management II
tags: [OSDI]

---

# NCTU OSDI Dicussion - Memory Management II
###### tags: `OSDI`


* linux kernel 是如何使用 MMU ，把我們在 buddy system 或 slab allocate 到的 physical memory 轉成 virtual address?
    * ![](https://i.imgur.com/S4DtzTl.png)

* 假設我們的 buddy system allocate memory 的狀況如下，那如果我們去要一塊 11KB 的連續記憶體，是不是會 allocate 16KB?
    * 4 page (16KB). `alloc_page()` 
    * linux has support 4 + 8K allocation. 
    * `alloc_pages_exact()` is the API to allocate exact page numbers.
    * 4KB(已使用)、4KB(未使用)、8KB(未使用)、16KB(未使用)

* 在我們乎叫 malloc 時是直接 kernel allocate 記憶體給我們嗎？（後來有找到資訊是 malloc 有 Copy on Write 的機制，會先分配 virtual memory 給我們，當要使用時才會 allocate 實體記憶體）
    * `malloc()` allocates from heap (brk). The heap is given by the kernel.
    * `malloc()`並不會配置physical空間。只是單純去跟VMA claim一塊空間。真的要去用到到，發生page fault時，才會真的產生physical空間。
    * 這些空間在virtual空間中時可以被合法使用，但他可能不是在physical空間。
    * 當heap空間不夠了，會再跟VMA要求heap extension，但這些都是virtual memory。
    * `sbrk()`
    * 
        ```c
        int * i;
        i = malloc (80) // 80 (bytes)
        /* i within heap () virtual address space */
        /* i 的空間就只會先被宣告，但在physical上還不會有 */
        i[0] = 10;
        /* 要使用到才會在physical上看到 */
        ```
* node與zone的關係是每個node都會有自己的zone嗎?如果每個node都有ZONE_DMA，會不會造成記憶體浪費?
    * ![](https://i.imgur.com/nLYFiMN.png)
    * node 
    * zone 是跟記憶體特性property有關，館個別記憶體在幹嘛用的東東，kernel要用的東東。
    * 兩個記憶體會有各自的ZONE，page table。
    * 記憶體浪費跟配置策略有關跟ZONE無關。像是每次都給DMA，這樣就不是很OK。
    * local normal -> local DMA -> remote normal -> remote DMA可能要的順序。
 
* 為什麼在ZONE_HIGH要不到記憶體的話可以去ZONE_NORMAL拿? ZONE_NORMAL不是給kernel用的嗎，這樣不就會讓user space和kernel space混在一起?
    * ZONE is about physical memory. User space/kernel space is about virtual memory. 
    * 要得順序？記憶體的價值，DMA很珍貴，不要亂給。ZONE high給USER，ZONE nomal、DMA是給kernel的。
    * 有可能USER一直要一直要ZONE high給完給，給ZONE normal，用完，給DMA。kernel可能不夠用？USER會被swap out到HD上。

* slab allocator 中有一個部分是cache，所以在硬體中真的有一塊cache是專門留給slab使用嗎，要怎麼去跟硬體協調流出這樣的一塊空間?
    * Cache in slab allocator is a concept term which is not the physical cache. 
    * 這ˋ個cahce不是硬體cache，只是一個暫存的概念。不要搞混啦。

* Shared library在physical memory中被放在哪裡？
    * 老師說問題很好玩XD。
    * shared library is done by VFS and mmap by file descriptor, it  is located at page cache of the library file.
    * ![](https://i.imgur.com/SnvLYIL.png)
    * Stack 跟 HEAP 中間有一塊會被拿來放shared library。
    * ![](https://i.imgur.com/DS7nKUL.png)
    * 實際shared library會被KERNEL找到地方擺啦。
    * 這樣USER使用shared library是不是就是在access kernel code？
        * 實際USER是使用virtual memory，所以他只是以為在那裡。實際kernel會再做轉換。所以user並不算是實際多澳kernel code。
    * USER可以改shared library data？
        * 假如glibc有全域變數，可以改？全域變數是屬用application的，該變數在被使用時就會被放到application 中。
        * 全域變數實際會被放到application中才對。
        * shared library一樣有data segment，private data中。在MM機制下，有copy on write。當要read時候，大家都拿同一份，但是要write的時候，就會有copy on write的動作。然後physical位置就會被改，logical位置不一定，因為user可能會指定shared library 在不一樣的logical address。
        * ![](https://i.imgur.com/AP2zMmZ.png)

* 為何Physical Address Space多了ZONE_DMA, 卻和Virtual Address Space一樣大小(4GB)?
    * 老師說問題怪怪的
    * ![](https://i.imgur.com/HuWnSfp.png)
    * Left cannot directly map to right

* kmalloc在什麼情況下會被呼叫?
    * 你呼叫的時候whem you call it。
    * ![](https://i.imgur.com/BYI14aN.png)
    * ![](https://i.imgur.com/Vp7JlkB.png)
* Buddy system 的O(1)是指amortized cost 嗎？不然照著課堂上的過程看起來worst case是O(logn)
    * 對啦，就不適O(1)，這是一個好棒棒的說法而已。
    * 假設n 是physical memory size。L 是level。
    * Precisely speaking, if level is L, buddy system is O(L).
    * ~~網路上找不太到對於buddy system 複雜度的資料，但有看到有人說是log n~~
    * https://www.geeksforgeeks.org/buddy-memory-allocation-program-set-1-allocation/

* 在用region 控制access privilege的時候，課堂上放了兩種不同的方法，但圖中這種privileged access的區域反而是比較小塊的，這個要如何達成權限控制？不是應該是權限低的的區域被限制嗎？
     * 對啦，就是有點錯啦。
     * 老師說這邊書有點多的勘誤。
     * ![](https://i.imgur.com/0jeaD4d.png)
     * Region 0 是 kernel 空間。Region 3是空間。

* mpu 標記是 code 還是 data 的意義是什麼？不是使用 read write 之類的就可以控制好權限了嗎
    * yes, read/write will be sufficient. 

* 課程中有提到如果今天要一塊 zone_high 的 memory 不夠的話 就會拿 zone_normal 的給它 如果以此類推 是不是只有 zone_dma 才會發生 swap
    * 老師說問題怪怪的，SWAP好像不是這樣。
    * SWAP是指virtual空間實際被丟到HD上。然後把空間分給其他人用。
    * 所以ZONE是管空間使用，所以他們都會有可能被丟出去。假如ZONE DMA是被分給USER的話，的確有機會被丟出去。
    * kernel space is not swapped into a HD`

* \[solved]我們在寫一般的 c 程式的時候 是用 malloc 是會拿到當初 kernel assign 給我們的 memory 還是會在去重新找一塊給我們

* 上完課後對 slab 還是沒什麼概念，於是又上網找了一些資料才有比較知道 slab 在做什麼 (Solved)
    * jserv：slab 向 buddy system 去「批發」一些記憶體，加工切塊以後「零售」出去
    * Ref: https://hackmd.io/@sysprog/linux-memory
    * Ref: https://events.static.linuxfound.org/images/stories/pdf/klf2012_kim.pdf

* 在查資料的過程除了 slab 也看到 slub/slob，不知道是什麼東西？(Solved)
    * slab: 來自 Sun OS
    * slub: 對 slab 的改進，目前為 linux 默認的模式
    * slob: 為小型系統設計

* High memory 是可有可無的嗎？**對**。上課以 x86 為例有提到 ZONE_HIGHMEM？那為什麼我在機器上(x86_64) cat /proc/buddyinfo 沒有看到 ZONE_HIGHMEM 只有 DMA、DMA32、Normal？
    * High memory appears in x86 for some historical reasons. ARM64 does not have high memory zone.

* 若是目前ZONE_NORMAL滿了，則可能分配ZONE_DMA給ZONE_NORMAL使用，若此時有ZONE_NORMAL釋放了記憶體，且又有請求ZONE_DMA，目前的做法是否會將借用ZONE_DMA的ZONE_NORMAL移回ZONE_NORMAL區塊呢?還是就會ZONE_DMA request fail?
    * 老師說題目很好玩。
    * 原本要normal的，不夠了，所以給DMA。那假如哪天normal有人還了，有空間了，該DMA會被切回normal嗎？問題：allocate一個physical空間，能不能是動態的？就是這個mapping會不會被更改？還是一定是要靜態的？**動態的啦**
        * logical被mapping到哪裡，USER不需要care。
        * 假設一個USER原本logical空間被對到DMA，會不會哪那天被對到NORMAL上。
        * 會啊，SWAP就是這樣嘛。

* slab allocator能夠將一個page內的資料在分成許多object來管理，並在程式請求的時候分配給他，若object不夠了則再向buddy system要新的page來管理成多個object，這樣理解對嗎?
    * yes.

* 若上述是對的，看起來slab allocator能夠更有效率的管理記憶體，那為什麼還需要buddy system呢? 是因為buddy system是O(1)，在分配大量記憶體很有效率嗎?
    * slab allocator 是架在 buddy system之上。
    * slab allocater 是在解決連續記憶體配置之後浪費的問題。
    * 他們倆個要解決的問題不一樣。
    * 假如要slab allocator要支援配置記憶體，那就又會跟buddy system長樣啊，那他還是一樣的嘛
    * slab allocator does not know continuous pages.

* zone是不會隨著node的大小等比例縮放嗎?如果node的記憶體太小就可能會沒有zone_high或zone_normal?
    * No, zone is about memory property. 
    * 他就是個特性的紀錄嘛

* 影片中提到可以向下去要空間(如:zone_high->zone_normal)，為什麼是user可以要kernel的空間?
    * zone is aobut physical memory. user/kernel is about virtual memory. 

* 在記憶體未滿前swap清記憶體空間的程式會是什麼方法執行，是interrupt handle嗎?
    * ???
    * 問題有問題啦

* linux如何不做packing還能降低internal fragmentation? (已解) 

* OS無法控制應用程式的撰寫，如果應用程式都透過kernal thread保證拿到連續的memory，如何限制應用程式或確保memory連續。
    * 假如你有辦法都寫在kernel thread、kernel space，那你就都是kernel啊，那就是你要負責啊，奇怪耶。
    * You can write kernel thread and request continuous physical memory. 

* linux進行統計是從世界上的使用者回報的資料統計，還是內部做模擬統計的結果？ (已解)

* 若zone_dma不夠用的話,該怎麼處理呢?
    * allocation fails. ㄚ就會失敗啊，可能會去swap別人？
    * 假設你很重要，你需要DMA，但是沒有DMA了，你要怎麼決定哪些東西不是那麼重要，然後把他們趕去zone normal？
        * 除非別人一開始就是要normal然後你給dma，這樣你把別人換去normal這樣就沒事，但假如他就是要DMA你給人家換了，ㄚ不就掰了。
        * 很難設計耶
        * 你要怎麼知道physical page frame是怎麼被配置出來的？你知道別人是怎麼allocate page的嗎？他們一開始是要dma還是normal這件事知道嗎？
        * 老師覺得他沒有記下來耶，對起來就是對起來了。
        * 所以老師覺得不會重新配置。
        * 助教說，他有看過code，可能會把page migrate起來。就是會有一個flag記說這塊memory能不能被搬動，然後就可以亂搬。
        * 老師說有空看看code
        * 一個叫甚麼movable的flag。
        
* slab allocator是如何利用一個page(4k mem)來切成多個task struct(1k mem)? 
    * slab allocation policy
    * ![](https://i.imgur.com/xQWJYqe.png)
    * ![](https://i.imgur.com/0p4W1RZ.png)
    * Slub 是目前 Linux kernel 上面預設的 slab allocator。所謂的 slab 就是從 buddy sysytem 要一個 page 過來，之後依照不同的 kmalloc 所丟入不同的 object size (such as kmalloc-96, kmalloc-192, kmalloc-8, kmalloc-32, etc) 把 page 內部切成 object size 為單位的格式。之後 return freelist 的第一個 free 的 object 給 kmalloc 的呼叫者。其中，初始化過後，每個 object 的頭 8 個 bytes 儲存 freepointer 指向下一個可得的 available object size。用 linked list 的方式串起整個 slab(page) 內部所有空的 objects。當之後有人 return free 的 object 這時候若是 local return(alloc & free 是同一個 page)則會走 fast path 直接 return 回 per cpu page freelist。若是 remote return 則會走 slowpath return 回 page->freelist。由於有兩條 freelist 的緣故，在 deactivate_slab (把 page 返回 Per node partial list)的時候會計算 page->inuse（把 page->objects 減掉兩條空的總和）就是當下在使用的 object 數量。而分兩條 freelists 的目的是為了加速 allocate & free 的速度不要卡在 critical path。
    * 參考： https://hackmd.io/@VIRqdo35SvekIiH4p76B7g/rJ-UJ_uWx?type=view

* 通常如果可以 physical contiguous 且 logical contiguous 的話，就會直接這樣配嘛，那有甚麼情況下會特別要求一定要 physical uncontiguous嗎？
    * logical memory is demand paging policy which cannot guarantee physical contiguous.
    * 不會這麼無聊的要求。只是不保證pysical連續這樣。

2. 看起來slab allocation是只給kernel用嗎？因為只有kernel才能確定有哪些object會一直被使用，所以先cache起來，那user space會走這邊嗎？如果會的話，slab要怎麼知道哪些是常用需要cache哪些不用？
    * slab is for kernel memory allocation. For users, it is about virtual memory management. 
    * slab is 給kernel用的啦。

3. 在zone的說法，實際硬體中可能有很多種memory而分不同node，node底下用zoned buddy allocator，那今天需要allocate memory的時候，要怎麼知道要你哪個node要，整個系統是不是就會有很多的zoned buddy allocator？
    * there is a buddy allocator (code) but there are many nodes/zones (data structure). buddy allocator follows a policy to allocate pages under different zones/nodes.
    * buddy allocator是一段code，所有CPU都run這個code。data另外存。4個CPU就會有個別存的data structure。
    
* (已解答) 在Internal fragmentation那邊老師有提到有些嵌入式系統會用不同的frame size去做分配，那這樣是不同size的frame size要分別放在不同的frame table裡，然後實體上來說也要稍微分開(像uCLinux那樣)?

* 所以node的分法就像是我插了兩張不同速度的記憶體，他就會分成不同的node，還是可能是同一張記憶體但是又被分成很多塊?
    * node is for NUMA. 
    * ![](https://i.imgur.com/06Hi5b5.png)

 
* 為何不是ZONE_DMA空了之後往高處去要空間、而是ZONE_NORMAL可以往下要空間?
    * ZONE_DMA is an area for DMA and I/O. 

* MMU 和 MPU 是如何運作的？他如何和 OS 進行溝通？
    * 也是透過 Exception。
    * Basically MMU sits between the CPU itself and external memory and translates virtual memory addresses produced by the CPU into physical memory addresses and raises an exception when there isn't a valid mapping for the requested operation and address.

* Buddy System 聽起來像是 O(logN) 的複雜度，但是影片好像說成 O(1)？不知道是不是我理解有問題。
    * https://kknews.cc/zh-tw/code/rjvoeqn.html
    * 有看到 scalloc 是 O(1)
    * https://hackmd.io/@jserv/B1SRlfeee?type=view

* zone 的記憶體分作 DMA NORMAL HIGH，那這三者有些什麼性質？
    * ZONE DMA 的範圍 0~16M，該區域的物理頁面專門供 I/O 設備的 DMA 使用。之所以需要單獨管理DMA的物理頁面，是因為DMA使用物理地址訪問內存，不經過MMU，並且需要持續的緩沖區，所以為了能提供物理上連續的緩沖區，必須從物理地址空間專門劃分一段區域用於 DMA 。
    * ZONE NORMAL 的範圍是 16M ~ 896M ，該區域的物理頁面是內核能直接使用的。
    * ZONE HIGHMEM 的範圍是 896M ~ 結束，該區域即為高端內存，內核不能直接使用。
    * 那這邊說 DMA 可不經過 MMU，但課堂上說 NORMAL 要不到可能會找 DMA 要，這時如果要到的 memory 沒有 MMU 保護，會不會發生什麼問題？
    * https://github.com/wangdongyu1989/Memory-Management/blob/master/linux%E5%86%85%E6%A0%B8%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86(ZONE_DMA%20ZONE_NORMAL%20ZONE_HIGHMEM%E4%BB%8B%E7%BB%8D).md
    * 在 buddy allocation 那邊將空的空間 merge 成大塊的連續空間，這樣會不會常常不斷的在合併跟切割。如果這個 list 時常保持著每一種 size 的空間都有會不會比較好
    * 有很多小的物件很容易產生 internal fragmentation，是不是越多物件是 static allocate 越好，這樣物件就可以整齊的排好也不太需要去動它，特別是對於現在 RAM 並沒有那麼吃緊的系統。
    * 如果系統有比較緩慢且很多的 IO 裝置，需要慢慢的複製資料到 DMA 這樣 16MB 會不會有點太少。
    * DMA also has size limited. 
    * 
        ```c
        #define ARM64_ZONE_DMA_BITS	30
        ```

* Buddy會造成較多的內部碎片化，後來在查的時候有發現到 contiguous memory allocator (CMA) 可以彌補這個狀況，會先分配一塊空間給Driver使用，當Driver不用時會給User process去使用，但是若Driver需要的話便可以回收這塊空間給Driver，不過沒太能理解這樣的想法是怎麼運作的
    * https://events.static.linuxfound.org/images/stories/pdf/lceu2012_nazarwicz.pdf

* 除了原本的slab以外，還有slub 跟 slob ，該如何理解這三者的區別及實做？
    * [已解決] 在jserv提供的資料中看到：https://hackmd.io/@sysprog/linux-memory 以及 https://events.static.linuxfound.org/sites/events/files/slides/slaballocators.pdf

* slab allocator 是怎麼幫自己分配一個cache做初始化自己的？
    * [已解決]https://lonzoc.gitbooks.io/linux-slub/boot-cache%E5%88%9B%E5%BB%BA%E8%BF%87%E7%A8%8B.html

* 除了 slab, linux 還有slob, slub，分別有甚麽差異。分別為了解決什麼樣的問題
    * Ans: ref(https://hackmd.io/@sysprog/linux-memory)

* 作業系統在開機的過程中，會使用 bootmem 分配計，竟然OS 是作裸機開發，整個記憶體都是撰寫者在控制，謂何又需要一個分配器來管理？
    * Ans: ref(https://www.cnblogs.com/chengxuyuancc/p/3427139.html)

* 前面有講到 page-frame (page size 爲單位作分配），而後面又提到 buddy (以2的冪次方作分配)，兩者之間有何關係。是完全獨立的演算法，或是可以配合使用。

* 在 x86-64 中有對記憶體區塊做保護，像是指令段不能被改寫，data 段不能執行，請問這是透過 MPU 來實做的嗎？
    * ![](https://i.imgur.com/2jrDmVV.png)

* 在 user space 第一次使用 malloc ，系統會透過 sbrk() 給一塊大塊個記憶體並由裡面去切割記憶體給 malloc 和malloc的結構用，那這樣如果 malloc 使用的記憶體東西很少，internal fragmentation 不就會很嚴重？這樣如果資料量很小是否改成像是矩陣的方法來儲存會比較好？ 
    *  sbrk allocate virtual memory, ptmalloc will handle fragmentation for you
    *  ![](https://i.imgur.com/vsN8u4b.png)


* 影片中提到 physical memory management 會有 fragmentation的問題，但是 visual memory 應該也會導致physical memory fragmentation發生吧？還是直接用 physical memory management缺點會特別大。
    * ???
    * Visual memory本身應該沒有fragmentation，是分配到physical memory才會發生

* physical memory 的管理，是把 MMU 用硬體做的事，改成用軟體做嗎？
    * ???
    * 我搞錯MMU的用法，應該沒問題了
    * ~~不要來鬧啦~~

* malloc()拿到的記憶體，都是physical memory連續的嗎？
    * there is no guarantee if the size is > page. 

* MMU 跟 MPU 可能同時存在嗎？
    * why?

* multi programming 中，三個 task 都有用到 region3，這樣不會有權限問題嗎？還是其實 region3 裡面包含很多個 segment，彼此不能互相 access？
    * Region such as ring in x86 is about access control. 

* CPU 去 access 非自己 node 下的 memory 會比較慢，那 DMA 在搬不同 memory 之間資料時也會有快慢問題嗎？
    * No. Node is about memory hardware, zone is about property of memory area. 

* 在 MPU 中如果能夠個別設定每個 region 的讀寫等權限，是不是就沒有必要區分 code 和 data 了，因為前者可以做到更細度的權限控管？
    * yes.

* ZONE_HIGHMEM 不夠時，可以去跟 ZONE_NORMAL 要，可是 ZONE_NORMAL 是放 OS 的地方，這樣不會造成安全性的問題嗎?
    * Zone is about physical memory. 

* 把 memory region 分成 instruction 和 data 的用意是什麼，不是只要分 access permission 就好了嗎？
    * yes. 

* MMU 會根據現有記憶體大小來依比例分配三個 zone 的大小還是說 DMA zone 和 NORMAL zone 必須要有固定大小(或以上)的記憶體？ 
    * there is nothing about MMU at zone configurtaions. 

* MMU 怎麼知道現在要 allocate memory 的這個東西的 structure 跟 slab allocator 裡 cache 住的 object structure 是一樣的？
    * MMU does not know this. 

* 為甚麼把kernel和user overlap可以有效的保護記憶體呢? 想不出如果kernel和user的memory如果不overlap，那相比於overlap可能帶來的overhead是甚麼?

* MPU具體的有效來自甚麼地方呢?如果只是想保護task不會access到其他的memory，那麼不能只是用幾對指標去定義可以有效access的上下界就好嗎?
    * MPU is hardware for memory access control. 

* By default C 是沒有garbage collection機制的，如果user program可以占用一塊未來不再存取的memory，這樣是不是不太好呢? garbage collection有甚麼缺點讓C選擇不implement呢?
* Ans: 
    * [Why do languages such as C and C++ not have garbage collection, while Java does? ](https://softwareengineering.stackexchange.com/questions/113177/why-do-languages-such-as-c-and-c-not-have-garbage-collection-while-java-does)
    * [Garbage Collection in C Programs](https://www.linuxjournal.com/article/6679?page=0,3)

* [solved]ARMv8 用 MAIR_ELx 設定 Memory Attribute

* [solved]Slab 又被分為 SLOB, SLAB, SLUB。 SLUB 有 defragment 技術
    * https://events.static.linuxfound.org/sites/events/files/slides/slaballocators.pdf

* [solved]存取非常大的 physical address (0xffffffff00000000) 會怎麼樣? 
    * 觸發 instruction abort exception

* MPU是在什麼樣的情況下會選則cache copyback或cache writethrough?
    * the question should be in what situation, programmer prefer writethrough and writeback.

* 在libc的ptmalloc都是維護linked list的資料結構，那如果用hash table的方式來儲存空的memory chunk，當有需要分配記憶體時就直接hash table找給他，缺點是需要維護hash table，但是其實linked list也需要額外的維護，請問這種hash table方式會比較好嗎?
    * think if you design this, how will you do that?

* 為何linux會寧願有大量的Internal Fragmentation，而不是採用老師說的透過multiplex more memory block requests into one page來折衷?
    * slab allocation tries to solve the problem. 

* [Solved]External Fragmentation 為何在 Linux Kernel 較不影響?
    * https://en.wikipedia.org/wiki/Fragmentation_(computing)#External_fragmentation

* ~~設計上讓cache line分開一點的用意是什麼(?~~
    * ???
    * I think that is a misunderstanding about cache.
    * As TA mentioned -> Cache in slab allocator is a concept term which is not the physical cache. 

* 要大空間時還是會出現internal fragmentation嗎? 還時其實可以切完整的跟零碎的給?(ex: 513MB -> 512MB + 1MB)

* [Solved]我們release task時，分配好的kernel stack跟user stack是不用release的嗎? 下一次要產生新的就拿released的嗎?
    * (Ans: 現在我們是固定，可是之後可能是動態allocate 這時候拿已經allocate的就好)

* 最一開始開機時沒有MMU or MPU應該是用實體的address吧?大概是怎麼從實體的address轉換到virtual的呢?
    * ~~don’t you do this for your homework?~~
    * 作業還沒出啦，老師不要嘴。

* 已經知道 node 跟 NUMA 有關，但還是不太清楚 node 跟 zone 的關係是什麼？
    * numa system has several nodes, each node can be divided into zones

* Linux 是如何解決有關 NUMA 的問題的呢？
    * by writing numa-specific code
    
* Slab 可以把常用的資料結構 cache 起來，不用再 allocate , free，但 free 回去的 page 可能和之後 allocate 的 page 長得不太一樣，這邊是如何處理的呢？
    * why different?

* kmalloc 與 vmalloc 的差別在於是否是實體上連續的記憶體空間，想請問實體上不連續為什麼會讓kernel讀取的性能增加？ 抽象出 virtual memory 這一層應該要保證存取的行為保持一致吧？但影片說到因為可以直接計算 offset，但是 virtual memory 與 physical memory 的轉換不是 MMU 處理的嗎？

* 目前的 page/frame 是固定大小的分割，為什麼不要分成 2K, 4K, 8K... 類似 buddy 的方式讓 kernel 管理？這樣可以達到縮小 internel fragment 又可以限制 manage mapping table 大小的功能吧？
    * you can do this, but linux use slab/slob/slub for small allocation, and buddy system has higher overhead on small allocation
    * https://people.eecs.berkeley.edu/~kubitron/courses/cs194-24-S14/hand-outs/bonwick_slab.pdf

* 在 glibc 中有 tcache, unsort bin, small bin...等等把被釋放的記憶體暫存的機制以加快速度，但也造成許多安全上的漏洞。那在 kernel 的 memory management module 中使用類似的快取機制是否也會造成類似的攻擊?
    * think what are the differences between glibc allocation and kernel memory allocation. 
    * Unsorted Bin Attack - ctf-wiki (https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/unsorted_bin_attack-zh/)
    
* 不了解nodes ? 
    * Ans: 是因為 
    Non-Uniform Memory Access (NUMA) ，
    so memory may be arranged into banks and each bank is called a 
    node. When allocating a page, Linux uses a node-local allocation policy
 to allocate memory from the node closest to the running CPU [https://www.kernel.org/doc/gorman/html/understand/understand005.html]

* Page size 為什麼要一樣大？
    * (Solved, 跟 cpu 設計的 page frame 有關, 且有些 cpu 有支援不同大小的 page size)
    
* linux kernel 提供 page, kmalloc 等為了不同 size 的 memory allocation API. 這代表 Kernel 的 developer 要自己根據要 allocate 多少 memory 而選擇用哪種 API ? 
    * (Solved)

* 在 NUMA 架構下, linux 配置記憶體會先從同一個 socket 的 memory 配置嗎？
    * (Solved, https://www.kernel.org/doc/html/latest/admin-guide/mm/numa_memory_policy.html)

* 之前一直提到過，user 3G OS 1G，這應該是針對定址能力會有所變化吧?
    * ???

* 在進入 zone 的內容前有提到有 node 管理遠近的概念，但是圖表中只有一個 node 在最上面，實際上是怎麼透過 node 管理遠近的記憶體呢? 另外 zone 當中提到有一些 device 的 zone，是指這些定址能力要讓給 device 存取，還是指一些 device 運作的時候如果需要記憶體會用到這塊呢?

* slab 的那個關係表格中， 有 last cache/next cache 的圖，想請問這是指甚麼。而在圖表中都是以 cache 為開頭，所以原則上都是以會有 cache 去使用 slab allocating 作為 slabs 的第一步嗎? 如果整個系統第一次要小的 object 也是一樣的流程嗎? 而 full slabs 這種 page 都被吃滿的 slabs 真的很多嗎? 如果 slabs 能很好的從 page 中分割出適當的小 obj，那麼為甚麼要分 full/partial/free 呢? 對 slabs 來說，從 pages 分出來最小單位的 obj 可以有多小呢? 系統多數時間都在使用小記憶體， 這樣 slabs 的演算法的複雜度會不會非常影響記憶體存取的效率呢?  一個 memory 需求一下來，是由誰直接判斷該 memory 是直接用 page 還是 slabs 呢? 