Step to UEFI (190)Segment Registers in 64 Bits mode

最近在 “Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D and 4”看到下面这一段话:

以是说,在 64Bits模式下 CS DS ES SS 的 Base 无论设置为什么,都会被认为是0.

于是,做实验进行验证:

1.我尝试直接在BIOS中修改 GDT 发现会导致 Post 死机。

2.尝试编写一个Driver来完成加载新的 GDT 的事情。最简单的方法是修改前面的 CPUDxe。直接拿来主义将 CpuDxe Copy 一份修改为 MyCpuDxe。使用下面的语句进行编译:

build -a X64 -p ueficpupkg\UefiCpuPkg.dsc -m UefiCpuPkg\MyCpuDxe\CpuDxe.inf

3.根据前面的研究, DS 段选择子设置成 Base=0x4000 (CpuGdt.c)

  //
  // LINEAR_DATA64_SEL
  //
  {
    0x0FFFF,        // limit 15:0
//LABZDebug 0x0,            // base 15:0
   0x4000,            // base 15:0
    0x0,            // base 23:16
    0x092,          // present, ring 0, data, read/write
    0x0CF,          // page-granular, 32-bit
    0x0,
  },

4.上面的代码后,使用 Load MyCpuDxe.efi 加载运行。再使用之前的gdt.efi 查看当前的GDT。

5.随机选择一个内存位置,比如:0x3000.使用 Mem指令查看, 结果如下

Memory Address 0000000000003000 200 Bytes
  00003000: 36 EF 55 63 64 A5 7C 87-34 FF 57 73 66 B5 7E D6  *6.Ucd.|.4.Wsf.~.*
  00003010: 24 FF 47 73 76 B5 6E D6-A4 FF C7 73 F6 B5 EE D6  *$.Gsv.n....s....*
  00003020: A4 FD C7 71 F6 B7 CE D4-A4 DD C7 51 F6 97 EE F4  *...q.......Q....*
  00003030: 84 DD E7 51 D6 97 DE F4-C4 DD A7 51 96 97 8E F4  *...Q.......Q....*
  00003040: 11 3E 9D 0F 5A 17 38 9B-10 3E 9C 0F 5A 17 39 9B  *.>..Z.8..>..Z.9.*
  00003050: 30 BE BC 8F 7A 97 19 1B-30 BC BC 8F 72 97 19 1B  *0...z...0...r...*
  00003060: 30 BC BD 8D 7A 95 19 19-34 BC BA 9D 7E 85 1D 09  *0...z...4...~...*
  00003070: 3C EC B0 DD 76 C5 15 49-7C EC F0 DD 36 C5 55 49  *<...v..I|...6.UI*

使用 DCI 查看

使用 DCI 修改此处值

使用 DCI 修改此处值

Memory Address 0000000000003000 200 Bytes
  00003000: EF CD AB 90 78 56 34 12-34 FF 57 73 66 B5 7E D6  *....xV4.4.Wsf.~.*
  00003010: 24 FF 47 73 76 B5 6E D6-A4 FF C7 73 F6 B5 EE D6  *$.Gsv.n....s....*
  00003020: A4 FD C7 71 F6 B7 CE D4-A4 DD C7 51 F6 97 EE F4  *...q.......Q....*
  00003030: 84 DD E7 51 D6 97 DE F4-C4 DD A7 51 96 97 8E F4  *...Q.......Q....*
  00003040: 11 3E 9D 0F 5A 17 38 9B-10 3E 9C 0F 5A 17 39 9B  *.>..Z.8..>..Z.9.*
  00003050: 30 BE BC 8F 7A 97 19 1B-30 BC BC 8F 72 97 19 1B  9*0...z...0...r...*

这就说明无论DS 的 Base 是多少,都是按照默认为0 来处理的(当然基本的检查机制还是存在的,需要保证加载正确的描述符).

完整的实验代码和EFI下载:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注