最近在 “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下载: