ia32保護模式中,邏輯位址=16位段選擇子:32位偏移位址,具體的值應該是指令經過編譯/彙編產生的,如果是應用程式設計的話,編譯/彙編只產生偏移位址,段選擇子的值由系統分配。在定址時,16位段選擇子位於cs/ss/ds/es/fs/gs暫存器中,32位偏移位址位於指令**中。
邏輯位址如何轉換成線性位址,線性位址又如何轉換成實體地址?
(1)如果要確定某**段中某變數的實際實體地址,首先要知道cs/ss/ds/es/fs/gs的值(包含該**段的段描述符在gdt中的偏移位址)和gdtr/ldtr暫存器值(包含gdt/ldt的基位址),可以從gdt中找出該**段的段描述符,此段描述符中包含**段的基位址。
該**段的基位址(32位)+變數的偏移位址(32位)=該變數的線性位址(32位);
(2)如果該線性位址是4kb頁的,
某本書位置=第x個書架 +第y層 +第z本
某線性位址=第x頁表 +第y個頁 +偏移z處
結合cr3(包含頁目錄的基位址)及線性位址高10位(
頁表在頁目錄中的偏移)可以找出第x頁表的基位址,再結合中間10位(頁在頁表中的偏移)找出第y個頁的基位址,再加上線性位址的低16位(頁內偏移位址,即偏移z處),也就是實際實體地址。
===============================
ps:cr0的第0位-pe:保護模式使能位,0時cpu工作於實模式,定址方式為16位段基址*16+16位偏移位址,定址1m空間,段基址取決於段暫存器cs/ss/ds/es/fs/gs的
內容,但與上面的描述無關。
cr0的第31位-pg:分頁使能位,1時定址如上描述,0時線性位址即實體地址,即不需要第(2)步的位址轉換。
相關暫存器及相關概念
cs/ss/ds/es/fs/gs-----seg. selector(段選擇子)
gdtr/ldtr---------seg. descriptors(段描述符)、gdt/ldt(全域性描述符表/區域性描述符表)
cr3-------------頁目錄頁表頁
===============================
邏輯位址,線性位址,實體地址
邏輯位址轉線性位址 機器語言指令中出現的記憶體位址,都是邏輯位址,需要轉換成線性位址,再經過 mmu cpu中的記憶體管理單元 轉換成實體地址才能夠被訪問到。我們寫個最簡單的 hello world 程式,用 gcc 編譯,再反彙編後會看到以下指令 mov 0x80495b0 eax 這裡的記憶體位...
虛擬位址 線性位址 邏輯位址
邏輯位址 logical address 是指由程式產生的與段相關的偏移位址部分 例如,你在進行c語言指標程式設計中,可以讀取指標變數本身值 操作 實際上這個值就是邏輯位址 它是相對於你當前程序資料段的位址,不和絕對實體地址相干 只有在intel實模式下,邏輯位址才和實體地址相等 因為實模式沒有分段...
實體地址 虛擬位址 邏輯位址 線性位址
實際計算機的物理記憶體的位址,為32位或者64位。常見的記憶體條就是一類ram 隨機儲存儲存器,特點就是加電狀態下可任意讀寫,斷電後資訊消失 現代os都提供一技術 虛擬記憶體 virtual memory 它可以使給使用者錯覺好像自己在使用比實際物理記憶體大得多的記憶體,實際上通過對映把虛擬記憶體的...