linux--線性地址、邏輯地址、物理地址

1、邏輯地址

   線性地址與邏輯地址是intel架構下的內存管理機制。機器語言指令中出現的內存地址,都是邏輯地址,需要轉換成線性地址,再經過MMU(CPU中的內存管理單元)轉換成物理地址才能夠被訪問到。即,邏輯地址-->線性地址-->物理地址。

   在機器語言指令中,來說明操作數或指令的地址。在x86架構中,每個邏輯地址包括兩部分:段(Segment)和偏移量(Offset)。比如:mov 0x80495b0, %eax中的0x80495b0就是邏輯地址。必須加上隱含的DS 數據段的基地址,才能構成線性地址。也就是說 0x80495b0 是當前任務的DS數據段內的偏移。

2、線性地址(虛擬地址)

   ARM架構下沒有線性地址與邏輯地址,只有虛擬地址與物理地址。

   在x86保護模式下,段的信息(段基線性地址、長度、權限等)即段描述符佔8個字節,段信息無法直接存放在段寄存器中(段寄存器只有2字節)。Intel的設計是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT內的索引值(index)。

  Linux中邏輯地址等於線性地址。爲什麼這麼說呢?因爲Linux所有的段(用戶代碼段、用戶數據段、內核代碼段、內核數據段)的線性地址都是從 0x00000000 開始,長度4G,這樣 線性地址=邏輯地址+ 0x00000000,也就是說邏輯地址等於線性地址了。

3、物理地址

  物理地址就是內存單元的絕對地址,用於內存芯片級的單元尋址,與處理器和CPU連接的地址總線相對應。比如你有一個4G的內存條插在電腦上,物理地址0x0000就表示內存條的第一個存儲單元,0x0010就表示內存條的第17個存儲單元,不管CPU內部怎麼處理地址,最終訪問的都是物理地址。在CPU實模式下“段基址+段內偏移地址”就是物理地址,CPU可以使用此地址直接訪問內存。

4、段頁機制

   x86 CPU中段機制(Segmentation)可以將程序的代碼(Code)、數據(Data)、棧(Stack)分開,這樣多個程序(或進程)就可以在同一個CPU上運行,而相互不會干擾。

   頁機制(Paging)用來實現傳統的以頁面爲需求的虛擬內存系統,只有程序需要時,才真正給進程分配物理內存。頁機制也可以用來隔離多個任務。

5、邏輯地址轉爲線性地址

在linux下是如下轉換的:

1)使用段選擇符中的偏移值 在GDT或LDT中定位相應的段描述符。
2)利用段描述符檢驗段的方位權限和範圍,以便確定該段是可訪問的並且偏移量位於段的段界限內。
3)把段的偏移量加到段的基地址上最後形成一個線性地址。

6、線性地址轉物理地址

   分頁的基本原理是把線性地址分成固定長度的單元,稱爲頁(page)。頁內部連續的線性地址映射到連續的物理地址中。X86每頁爲4KB(爲簡化分析,我們不考慮擴展分頁的情況)。爲了能轉換成物理地址,我們需要給CPU提供當前任務的線性地址轉物理地址的查找表,即頁表(page table),頁表存放在內存中。

依據以下步驟進行轉換:

1)從cr3中取出進程的頁目錄地址(操作系統負責在調度進程的時候,把這個地址裝入對應寄存器);
2)根據線性地址前十位,在數組中,找到對應的索引項,因爲引入了二級管理模式,頁目錄中的項,不再是頁的地址,而是一個頁表的地址。(又引入了一個數組),頁的地址被放到頁表中去了。
3)根據線性地址的中間十位,在頁表(也是數組)中找到頁的起始地址;
4)將頁的起始地址與線性地址中最後12位相加,得到最終我們想要的物理地址;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章