訂閱
糾錯
加入自媒體

linux內(nèi)存虛擬地址映射物理地址

2021-11-26 14:35
一口Linux
關注

Linux 內(nèi)核給每個進程都提供了一個獨立的虛擬地址空間,并且這個地址空間是連續(xù)的。虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶空間兩部分。不同字長(也就是單個 CPU 指令可以處理數(shù)據(jù)的最大長度)的處理器,地址空間的范圍也不同。

其中,所有進程的內(nèi)核空間,關聯(lián)的都是相同的物理內(nèi)存。進程切換到內(nèi)核態(tài)后,才可以訪問內(nèi)核空間內(nèi)存。我們下面說到的分段只針對用戶空間。

有兩種方式管理虛擬地址與物理地址之間的關系。

1、段式管理(Segment):由段選擇子和段內(nèi)偏移量找到物理地址。

用戶空間從低地址到高地址分別是五種不同的內(nèi)存段。

代碼段(只讀段),包括代碼和常量等。

數(shù)據(jù)段,包括全局變量等。

堆,包括動態(tài)分配的內(nèi)存,從低地址開始向上增長。

文件映射段,包括動態(tài)庫、共享內(nèi)存等,從高地址開始向下增長。(本圖沒有畫出)

棧,包括局部變量和函數(shù)調(diào)用的上下文等。棧的大小是固定的,一般是 8 MB。

分段容易出現(xiàn)碎片,內(nèi)存交換效率低(不容易換出到磁盤)的問題。為了解決這兩個問題,就出現(xiàn)了內(nèi)存分頁。

2、頁式管理(Paging):虛擬地址分為兩部分,頁號和頁內(nèi)偏移。

MMU 規(guī)定了一個內(nèi)存映射的最小單位,也就是頁,通常是 4 KB 大小。為了解決頁表項過多的問題,有多級頁表和大頁兩種方式。

并不是給進程的所有的虛擬內(nèi)存都會分配物理內(nèi)存,只有那些實際使用的虛擬內(nèi)存才分配物理內(nèi)存。這叫程序的局部性原理。根據(jù)此原理,為了提高訪問速度,MMU(Memory Manage Unit)里配有一個硬件:TLB(Translation Lookaside Buffer)。用于緩存進程常用頁表。

內(nèi)存分段和內(nèi)存分頁并不是對立的,他們組合起來使用,通常稱為段頁式內(nèi)存管理。

程序所使用的地址,稱為邏輯地址;

通過段式內(nèi)存管理映射的地址,稱為虛擬地址(線性地址);

通過頁式內(nèi)存管理將線性地址映射成物理地址。

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號