實地址模式與保護模式、虛擬地址映射

一、三種地址

邏輯地址:在有地址變換功能的計算機中,訪內指令給出的地址 (操作數) 叫邏輯地址,也叫相對地址。要經過尋址方式的計算或變換纔得到內存儲器中的實際有效地址,即物理地址。

線性地址:線性地址是邏輯地址到物理地址變換之間的中間層。在分段部件中邏輯地址是段中的偏移地址,然後加上基地址就是線性地址。如果不啓用分頁,那麼此線性地址即物理地址。

物理地址:線性地址經分頁轉換後就成了物理地址。

 

二、Intel X86 CPU 系列的尋址方式

X86系列,是指Intel從16位微處理器8086開始的整個CPU芯片系列,系列中的每種型號都保持與以前的各種型號兼容。

在X86系列中,8086和8088是16位處理器,而從80386開始爲32位處理器。

當我們說一個CPU是16位/32位時,指的是處理器中“算術邏輯單元(ALU)”寬度。數據總線通常與ALU具有相同的寬度(但有例外),

最自然的地址總線寬度是與數據總線一致的。

1、8086  實地址模式

8086中採用的是16位CPU,但地址總線是20位(採用和1M字節的內存地址空間),所以有些地址CPU訪問不到,爲了解決這個問題,在8086CPU中設置了四個“段寄存器”:CS、DS、SS、ES,分別用於指令、數據、堆棧和其他。每一個段寄存器都是16位的,對應於地址總線的高16位。

它有1MB尋址能力,那怎麼用16位的段寄存器表示呢?

    這就引出了分段的概念,8086CPU將1MB存儲空間分成許多邏輯段,每個段最大限長爲64KB(但不一定就是64KB)。這樣每個存儲單元就可以用“段基地址+段內偏移地址”表示。這樣就實現了從16位內部地址到20位實際地址的轉換(映射)。段基地址由16位段寄存器值左移4位表達,段內偏移表示相對於某個段起始位置的偏移量。

段寄存器<<4 + 邏輯地址(16位)= 線性地址 = 物理地址

但是這種操作是沒有地址空間保護機制的,對於每一個由段寄存器的內容確定的基地址,一個進程總能訪問從此開始的64K字節的聯繫地址空間,而無法加以限制。

實地址模式:是相對於之後的保護模式而言的,通過改變段寄存器的值再加上邏輯地址偏移量就可以對內存空間任何地方都可以訪問。(對內存空間的訪問無任何限制)

 

2、80386  保護模式

現代操作系統在剛加電時首先運行在實模式下,然後再切換到保護模式下運行。

80386 採用32位CPU,那麼他的ALU數據總線是32位的。最自然的地址總線寬度是與數據總線一致。當地址總線寬度達到32位時,其尋址能力達到了4G。因爲之後的版本要兼容之前的,所以80386保留了之前的段寄存器,還必須支持實地址模式,與此同時還要能支持保護模式。

80386的段式內存管理機制

保護模式通過“段選擇符+段內偏移”尋址最終的線性地址或物理地址的。

段選擇符爲16位,它不直接指向段,而是通過指向的段描述符,段描述符再定義段的信息。

每個段描述表項的大小是8個字節,每個描述表項含有段的基地址和段的大小和其他信息。GDTR裏存放GDT的信息。例如GDT大小8字節,即64位,其中32位放基地址,通過下標找到是哪一項。

 

三、線性地址到物理地址的轉換

task_struct中的pgd就是用代碼實現了上述過程

寫的好的博客:https://blog.csdn.net/LeeHannahSylvia/article/details/76239098

進程地址空間

 

 

 

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