32位邏輯地址空間到物理空間映射關係

前言:

這篇博文可以在你基本瞭解邏輯地址空間和物理地址空間的概念後,爲增強理解可通過我畫的示意圖來理解,本文會深入一些概念,以達到全面掌握該映射關係的目的。畫圖不易鴨,點個贊再走唄(✿◡‿◡)

邏輯地址空間及物理地址空間映射關係:

一、關係圖

我們編寫的 .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

關於頁表部分的內容,其實好的博文也很多,在此就不贅述了。感謝。

發佈了57 篇原創文章 · 獲贊 36 · 訪問量 7049
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章