# NCTU OSDI Dicussion - Memory Management II
###### tags: `OSDI`
* linux kernel 是如何使用 MMU ,把我們在 buddy system 或 slab allocate 到的 physical memory 轉成 virtual address?
* 
* 假設我們的 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,會不會造成記憶體浪費?
* 
* 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.
* 
* Stack 跟 HEAP 中間有一塊會被拿來放shared library。
* 
* 實際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。
* 
* 為何Physical Address Space多了ZONE_DMA, 卻和Virtual Address Space一樣大小(4GB)?
* 老師說問題怪怪的
* 
* Left cannot directly map to right
* kmalloc在什麼情況下會被呼叫?
* 你呼叫的時候whem you call it。
* 
* 
* 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的區域反而是比較小塊的,這個要如何達成權限控制?不是應該是權限低的的區域被限制嗎?
* 對啦,就是有點錯啦。
* 老師說這邊書有點多的勘誤。
* 
* 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
* 
* 
* 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.
* 
* 為何不是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 來實做的嗎?
* 
* 在 user space 第一次使用 malloc ,系統會透過 sbrk() 給一塊大塊個記憶體並由裡面去切割記憶體給 malloc 和malloc的結構用,那這樣如果 malloc 使用的記憶體東西很少,internal fragmentation 不就會很嚴重?這樣如果資料量很小是否改成像是矩陣的方法來儲存會比較好?
* sbrk allocate virtual memory, ptmalloc will handle fragmentation for you
* 
* 影片中提到 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 呢?