尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

lgdt 0x1210f61(%rip)

lgdt 0x1210f61(%rip) lgdt 0x1210f61(%rip) # 0xffffffff822110001. 指令拆解lgdt 0x1210f61(%rip)lgdt加载全局描述符表寄存器。0x1210f61(%rip)这是一种RIP 相对寻址方式。操作数的有效地址EA为RIP 0x1210f61。计算有效地址假设当前RIP指向lgdt指令的下一条指令。如果0x1210f61是带符号偏移量计算后得到0xffffffff82211000注释中已给出。重要结论GDTR 的基址并非直接等于0xffffffff82211000而是从这个内存地址读取的 6 字节数据中解析出来的。0xffffffff82211000是数据存放的地址而不是 GDTR 的值本身。0xffffffff82211000:0xffff82356000007f0xffff82356000007f需要按小端序 (Little-Endian)来解读这是 x86 架构的标准字节序。2. 数据解析从字节到字段首先将这个 64 位8 字节的十六进制数拆解为字节序列然后从中提取lgdt指令需要的6 字节48位数据。内存地址:0xffffffff82211000内存数据 (64位):0xffff82356000007f按小端序拆解为字节从低地址到高地址地址偏移01234567字节值0x7f0x000x000x600x350x820xff0xff小端序意味着数字的低位字节存储在低地址。例如数字0x12345678在内存中会存储为78 56 34 12。现在将这些字节填充到lgdt要求的 6 字节操作数中字段大小对应字节低地址到高地址字段值界限 (Limit)2 字节 (16位)偏移 0, 1:0x7f,0x000x007f基址 (Base)4 字节 (32位)偏移 2, 3, 4, 5:0x00,0x60,0x35,0x820x82356000注意偏移 6, 7 的数据 (0xff,0xff) 在标准的 6 字节lgdt操作数中被忽略。这可能是因为该内存区域恰好存放了其他数据或者它是一个更大的数据结构的一部分。3. 执行后的 GDTR 值执行lgdt指令后GDTR 寄存器中的值将更新为GDTR 基址 (Base) 0x0000000082356000GDTR 界限 (Limit) 0x007f在 64 位模式下GDTR 的基址是一个 64 位值。由于lgdt只加载了低 32 位高 32 位会被自动清零。4. 这个值的深层含义界限 0x007f(十进制 127)这意味着GDT 表的总大小为 128 字节(0x007f 1 0x0080 128)。因此这个 GDT 表最多只能容纳 16 个段描述符因为每个描述符占 8 字节。这是一个非常小且是启动时的 GDTLinux 内核启动完成后的常规全局 GDT要大一些。标准的 Linux 内核 GDT 通常有 256 个描述符界限为0xfff7。一个只有 16 个描述符的 GDT 表表明是一个临时的、精简的GDT在系统启动Boot的早期阶段使用或者在上下文切换Context Switch时作为某个特定任务的临时段表。基址 0x0000000082356000这是一个32 位的物理/线性地址高 32 位为 0。它指向低 4GB 内存空间的某个位置。这个 GDT 位于系统启动初期如 BIOS 或 Bootloader所使用的内存区域不依赖常规内核 GDT 的底层任务。关于未被使用的数据 (0xffff)内存中偏移 6 和 7 的数据是0xffff。由于lgdt只读取 6 字节这部分数据被完全忽略。它可能是其他数据结构的残留。一个更大的 8 字节数据结构的后 2 个字节比如TSS任务状态段描述符的部分数据。5. 总结执行lgdt 0x1210f61(%rip)后GDTR 寄存器将变为寄存器字段新值GDTR 基址0x0000000082356000GDTR 界限0x007f(GDT 大小为 128 字节)lgdt指令的目的操作数只是一个指针GDTR 的值完全由该指针指向的 6 字节数据决定。因此分析内存中的实际数据是理解lgdt行为的唯一正确方式。
返回列表