12---記憶體管理
記憶體管理的基本單位是什麼?
頁
什麼是記憶體管理單元(MMU)
管理記憶體並把虛擬地址轉化為實體地址的硬體
核心怎樣表示每個物理頁?
用struct page結構體來短暫描述當前時刻在相關物理頁記憶體本身,而不是存放在其中的資料。由於頁交換等原因,頁中包含的資料就不再與struct page結構體關聯。
核心怎樣管理系統中的物理頁?
核心利用struct page結構體來獲知頁是否被分配,分配給了誰。
頁的擁有者有哪些?
使用者空間程序、動態分配的核心資料、靜態核心程式碼和頁快取記憶體。
什麼是區?
具有相似特性的頁稱為區
核心為什麼要分割槽?
位於記憶體中特定實體地址上的頁不能用來處理一些特定任務,以及硬體的限制等原因,需要對頁進行分割槽處理
Linux中有哪些記憶體定址問題?
- 一些硬體只能用特定的記憶體地址來執行DMA(直接記憶體訪問)
- 一些體系結構記憶體的物理定址範圍大於虛擬定址範圍,導致一些記憶體不能永久的對映到核心空間。
針對硬體缺陷引起的記憶體定址問題,Linux怎樣分割槽來解決?
- ZONE_DMA-------這個區包含的頁可以用來執行DMA操作
- ZONE_DMA32-------這個區包含的頁只能被32位裝置訪問執行DMA操作
- ZONE_NORMAL-------這個區包含的頁可以正常對映
- ZONE_HIGHEM-------這個區包含的頁不能永久的對映到核心地址空間
記憶體分配有哪些識別符號,各是什麼作用?
- 行為修飾符:核心應當如何分配所需記憶體
- 區修飾符:從哪個區分配記憶體
- 型別識別符號:對行為修飾符和區修飾符進行不同的組合,簡化使用操作
各種型別識別符號的使用情形是什麼?
- GFP_KERNEL------程序上下文,可以睡眠
- GFP_ATOMIC------程序上下文,中斷處理程式、軟中斷和tasklet,不可以睡眠
- GFP_DMA|GFP_KERNEL------DMA記憶體,可以睡眠
- GFP_DMA|GFP_ATOMIC-------DMA記憶體,不可以睡眠
什麼是空閒連結串列?
空閒連結串列包含可供使用、已經分配好的資料結構塊。當代碼需要一個新的資料結構例項時,從空閒連結串列中取出一個數據結構塊,再填入資料,不必分配記憶體。使用後,將資料結構塊在放回空閒連結串列,不必釋放記憶體。
什麼情況下使用slab快取記憶體?
頻繁的建立很多相同型別的資料結構使用slab快取記憶體比空閒連結串列更方便
slab層的作用是什麼?
通過slab層為核心提供的介面建立和撤銷新的快取記憶體,為具體的物件型別分配和釋放快取記憶體,提高物件分配和回收的效能。
slab層是如何設計實現的?
slab層把不同型別的資料結構分為不同的快取記憶體組,一個快取記憶體可能包含著多個slab,每種資料型別對應一個快取記憶體。把事先分配好的物件存放到快取記憶體中,當需要新的記憶體存放資料結構時,slabc層從快取記憶體中得到一個物件來使用。
使用者空間和核心空間中怎樣分配棧空間大小?
- 使用者空間棧的大小可以動態增長而且棧空間很大
- 核心空間棧的大小是固定的而且棧的空間很小
如何給程序分配記憶體空間?
根據體系結構和編譯需求,給每個程序分配固定大小的棧,一般每個程序有兩頁的核心棧。32位和64位體系結構頁面大小位4KB和8KB,相應核心棧的大小位8KB和16KB。
什麼是高階記憶體?
高於896MB所有實體記憶體大小的範圍,不能永久的對映到核心地址空間。
有哪些記憶體分配方法,應用場景是什麼?
- kmalloc()------分配連續的實體記憶體,根據應用情形選擇不同的型別識別符號
- alloc_pages()------從高階記憶體分配
- vmalloc()--------分配連續的記憶體虛擬地址(邏輯地址),實體地址不連續。
- slab--------需要建立和撤銷很多的資料結構