深入理解linux核心--程序地址空間
阿新 • • 發佈:2022-05-21
核心的函式以直接了當的方式獲得動態記憶體:__get_free_pages()或alloc_pages()從分割槽頁框中獲得頁框;
kmem_cache_alloc()或kmalloc()使用slab分配器為專用或通用物件分配塊。而vmalloc()或vmalloc32()獲得一個非連續的記憶體區。這些函式都返回一個頁描述符地址或線性地址。
當給使用者態程序分配記憶體時,
- 程序對動態記憶體的請求被認為是不緊迫的,比如malloc()獲得動態記憶體時,並不意味著程序很快就會訪問所獲得的記憶體。
- 使用者程序是不可信任的,核心必須能隨時捕獲使用者態程序所引起的地址錯誤。
當用戶態程序請求動態記憶體時,並沒有獲得請求的頁框,而僅僅獲得對一個新的線性區間的使用權,這一線性地址區間就稱為程序地址空間的一部分,線性區。
程序的地址空間
程序地址空間由允許程序使用的全部線性地址組成。
- 當用戶在控制檯輸入一條命令時,shell程序建立一個新的程序去執行這個命令。結果是,一個全新的地址空間分配給了新程序。
- 正在執行的程序有可能裝入一個完全不同的程式。這種情況下,程序識別符號仍然保持不變,但是裝入程式以前的線性區卻被釋放,並有一組新的線性區被分配給這個程序(exec函式)
- 正在執行的程序可能對一個檔案執行“記憶體對映”,核心給這個程序分配一個新的線性區來對映這個檔案。
- 程序可能建立一個IPC共享線性區來與其他合作的程序共享資料。
記憶體描述符
struct mm_struct,程序描述符的mm欄位就是指向這個結構。記憶體描述符可以理解為程序所使用的虛擬記憶體的資料結構。記憶體描述符包含線性區
核心執行緒的記憶體描述符
核心線性僅執行在核心態,因此,他們永遠不會訪問低於TASK_SIZE(等於PAGE_OFFSET,0xc000 0000)的地址。與普通程序相反,核心執行緒不用線性區,因此,記憶體描述符的很多欄位對核心執行緒沒有意義。
線性區訪問許可權
頁:既表示一組線性地址又表示這組地址中所存放的資料。0~4095之間的線性地址區間稱為第0頁。
缺頁異常處理程式
linux的缺頁異常處理程式必須區分以下兩種情況:1.有程式設計錯誤所引起的異常;2.由引用屬於程序地址空間但尚未分配物理頁框的頁所引起的異常。