# 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 呢?