簡體   English   中英

打亂gdt表后通過數據段寄存器訪問數據就可以了嗎?

[英]Will it be OK to access data through a data segment register after I disturb gdt table?

我已經使用這些數據設置了 gdt 表

uint16_t gdt_table[][4] = {
    {   0,         0,      0,      0       },
    {   0xFFFF,    0x0000, 0x9a00, 0x00cf  },
    {   0xFFFF,    0x0000, 0x9200, 0x00cf  },
};

我做mov $16, %eax ; mov %eax, %ds加載帶有 GDT 條目的 DS。

現在我更改 gdt_table,或者只是將它設置為零(以打擾它)但不再重新加載%ds


這些是我的問題

  • 我想知道我是否仍然可以通過%ds訪問數據(在我打亂 gdt 表之后)
  • 每次我通過%ds訪問數據時 cpu 會檢查 gdt 表嗎?(那么 cpu 什么時候檢查 gdt 表,只有在 mov 時?或者每次我通過數據段寄存器訪問數據時?)

我認為 cpu 應該只在mov發生時檢查 gdt 表,然后在某處加載一些信息,因為它可以更有效(通過減少檢查頻率),對嗎?

我想知道我是否仍然可以通過 %ds 訪問數據(在我打亂 gdt 表之后)

它是安全的; 除非稍后從 GDT 重新加載 %ds。 中斷處理程序保存“中斷代碼的 DS”然后在返回中斷代碼之前再次加載它並不一定不常見。

每次通過 %ds 訪問數據時 cpu 會檢查 gdt 表嗎?

為了性能(避免重復訪問 GDT 和進行保護檢查),CPU 將(段基址、限制、屬性)信息緩存在段寄存器的“隱藏”部分。 在向/從 SMM 的轉換以及來賓和管理程序之間的轉換期間,也會保存和重新加載此信息; 所以 GDT 也不用於這些情況。

CPU 會為 DS 訪問 GDT 的唯一情況是存在 DS 的顯式加載( movldspop ds )或硬件任務切換(例如使用任務門)。 對於“返回 virtual8086 模式的中斷處理程序”(CPU 從 DS 恢復值),不使用 GDT,因為 CPU 正在加載實模式兼容值。 對於 CS 和 SS(但不是 DS),CPU 在使用中斷/陷阱門或調用門並返回(通過iretretf )時也會使用 GDT。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM