前言:
這篇博文可以在你基本瞭解邏輯地址空間和物理地址空間的概念後,爲增強理解可通過我畫的示意圖來理解,本文會深入一些概念,以達到全面掌握該映射關係的目的。畫圖不易鴨,點個贊再走唄(✿◡‿◡)
邏輯地址空間及物理地址空間映射關係:
一、關係圖
我們編寫的 .c 文件,經過gcc編譯後會生成一個 .s 文件,在 linux 環境下可通過 size 命令來查看其邏輯空間佈局,也就是說,在你的程序運行前邏輯地址已經分配好了,如下圖所示,但是物理空間的使用情況是不定的。
如果不清楚程序的執行流程,參見下圖,也可以去具體查看一下每部分生成的內容,更有助於理解:
之前我有博客也畫出過程序加載時的流程圖,有興趣可以回爐一下,簡單的說,會經歷一下流程:創建進程task_stuct;操作系統通過sys_exec對可執行文件進行映射;加載,包括頁表的創建及寫入操作;替換策略,目前linux仍使用的是LRU策略。
原程序.c文件經歷的幾個歷程:
1.預處理:展開頭文件/宏替換/去掉註釋/條件編譯 (test.i main .i)
2.編譯: 檢查語法,生成彙編 ( test.s main .s)
3.彙編: 彙編代碼轉換機器碼 (test.o main.o)
4.鏈接: 鏈接到一起生成可執行程序 a.out
二、用戶邏輯地址空間中的一些概念
看到一篇博文關於這部分內容講的比較基礎,可以參考一下:https://blog.csdn.net/yusiguyuan/article/details/45155035。這篇文章貌似是篇譯文,之所以引用,也是其中有關於堆棧的對比,還是很用心的,如下圖所示:
當然在c語言中使用的 malloc/free,亦或是在c++中使用的 new/delete,都是針對堆來進行操作的,對於不同大小的請求,也會被分解到不同的函數來做下一步處理,對於brk()和mmap()感興趣的可以再具體看一下,它們申請獲得的是一片連續的邏輯地址空間,如果想要真正的獲得物理內存,還需要操作系統提供的夥伴系統和slab分配器,這樣的內核分配器。爲了更直觀的展示邏輯關係,找了一篇博文中的圖片:
這個圖確實太糊了,但是找不到真正的原作者在哪篇博文裏的給出這幅圖,所以只能這樣展示給大家了。
結語:
羅列幾篇自己看了還覺得不錯的博文給大家:
https://blog.csdn.net/szu_tanglanting/article/details/16339809
https://blog.csdn.net/yusiguyuan/article/details/45155035
https://blog.csdn.net/weixin_41143631/article/details/81221777
關於頁表部分的內容,其實好的博文也很多,在此就不贅述了。感謝。