如果該位爲零,那麼內存是逐字節尋址的? 如果它是1,那麼內存是4Kb的4Kb?因此,例如,如果這個位被設置爲0,並且我的地址是 ,那麼我會在該位置處尋址 對嗎?如果我處理下一個位置 a001h,那麼這將是內存中的下一個字節?關於尋址內存,GDT的粒度位有什麼變化?
但是,如果這個位是1,我會尋址4Kb塊嗎?
那麼,解決一個000h給我一個4Kb塊,然後a001 下一個4Kb在內存中?
如果該位爲零,那麼內存是逐字節尋址的? 如果它是1,那麼內存是4Kb的4Kb?因此,例如,如果這個位被設置爲0,並且我的地址是 ,那麼我會在該位置處尋址 對嗎?如果我處理下一個位置 a001h,那麼這將是內存中的下一個字節?關於尋址內存,GDT的粒度位有什麼變化?
但是,如果這個位是1,我會尋址4Kb塊嗎?
那麼,解決一個000h給我一個4Kb塊,然後a001 下一個4Kb在內存中?
如果未設置粒度位,則會按原樣使用該限制。因此,如果限制爲0xfffff,基數爲0,則可以使用0xfffff或1048575個字節。但是,如果該位被設置,則20位限制向左移位12位。因此,對於相同的0xfffff限制和基數爲0的情況,實際限制爲0xfffff000或4294963200(十進制),可以提供完整的4GB尋址能力。
kbzombie的答案几乎是正確的。互聯網上的各種資源實際上也犯了同樣的錯誤,可能是因爲一方複製了另一方。
當設置粒度位時,限制確實向左移位了12位,但重要的是要注意插入了的一位。因此0xfffff
的結果限制爲0xffffffff
,而0x00000
的結果限制爲0x00000fff
。
The 80386 Programmer's Reference Manual有這樣說:
6.3.1.2限制檢查
段描述符的限制字段由處理器使用,以防止程序從外段尋址。處理器對限制的解釋取決於G(粒度)位的設置。對於數據段,處理器對限制的解釋還取決於E位(擴展方向位)和B位(大位)(參見表6-2)。
當G = 0時,實際限制是它在描述符中出現的20位限制字段的值。在這種情況下,限制範圍可以從0到0FFFFFH(2 - 1或1兆字節)。當G = 1時,處理器將12個低位1位附加到限制字段中的值。在這種情況下,實際限制範圍可以從0FFFH(2 -1或4千字節)到0FFFFFFFFH(2 -1或4千兆字節)。
它實際上比這更簡單:顧名思義*粒度*只是選擇* limit *字段的度量單位。 * G * = 0:使用字節。 * G * = 1:使用4KiB。其餘部分(移位,向下擴展,最小尺寸)都可以獨立於粒度或實現細節。 – 2017-09-20 22:07:07
@MargaretBloom我發現「使用4KiB」的描述有點混亂,因爲它意味着'0x00000'的限制實際上意味着0。那麼這個轉變的實施不是一個重要的細節呢?無可否認,我仍然需要實現分頁,所以我對事物的看法有限。 – Stijn 2017-09-20 22:12:00
是的,你說得對。儘管手冊的現代版本說低12位沒有經過測試,但它更好地被視爲一種轉變。英特爾如何在這樣一個基本主題上做出令人困惑的表述,真是令人驚歎! – 2017-09-20 22:17:31
標誌定義瞭如何所解釋[這裏]極限字段被解釋(http://wiki.osdev.org/Global_Descriptor_Table)。 – 2014-10-26 22:14:21