gpt4 book ai didi

c - 设置数据段后访问 GDT?

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:27 27 4
gpt4 key购买 nike

这是一个非常愚蠢的问题,但我似乎无法解决它。在我的操作系统中,GDT 是通过与内核链接的汇编代码设置的。当发生这种情况时,当然会在加载 GDT 时设置数据段和代码段。此信息在汇编代码中存储为

GDT_Contents db 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 154, 207, 0, 255, 255, 0, 0, 0, 146, 207, 0

所有段都设置得很好,但是我无法通过指向 GDT_Contents 的指针访问 GDT。我已经用几种方法对此进行了测试,主要是通过创建一个指向 0(即 GDT_Contents 的位置)的指针并回显它们的字节。它们与 GDT_Contents 不匹配。我很确定这是因为当 GDT 被加载时,它是相对于先前的数据段(0x0 或由引导加载程序设置,我不确定)。但无论如何,我现在不知道如何访问 GDT,我想设置 TSS 我不能将它硬编码到 GDT_Contents 中,因为它需要指向我的 TSS 结构的指针。我认为这与恢复以前的数据段一样简单,但我不知道该怎么做。这是设置GDT的汇编代码

    cli
mov dword [MultiBootInfo_Structure], EBX
add dword EBX, 0x4
mov dword EAX, [EBX]
mov dword [MultiBootInfo_Memory_Low], EAX
add dword EBX, 0x4
mov dword EAX, [EBX]
mov dword [MultiBootInfo_Memory_High], EAX
mov dword ESP, Kernel_Stack
mov dword [_NATIVE_GDT_Pointer + 2], _NATIVE_GDT_Contents
mov dword EAX, _NATIVE_GDT_Pointer
lgdt [EAX]
mov dword EAX, 0x10
mov word DS, EAX
mov word ES, EAX
mov word FS, EAX
mov word GS, EAX
mov word SS, EAX
jmp 8:Boot_FlushCsGDT

Boot_FlushCsGDT:
mov dword [_NATIVE_IDT_Pointer + 2], _NATIVE_IDT_Contents
mov dword EAX, _NATIVE_IDT_Pointer
lidt [EAX]
mov dword EAX, CR4
or dword EAX, 0x100
mov dword CR4, EAX
mov dword EAX, CR4
or dword EAX, 0x200
mov dword CR4, EAX
mov dword EAX, CR0
and dword EAX, 0xFFFFFFFD
mov dword CR0, EAX
mov dword EAX, CR0
and dword EAX, 0x1
mov dword CR0, EAX
call __ENGINE_ENTRYPOINT__

Boot_FlushCsGDT.loop:
cli
hlt
jmp Boot_FlushCsGDT.loop
ret 0x0

当然这是 32 位保护模式下的 x86。

最佳答案

使用sgdt指令获取GDT的大小和地址。这是一个物理地址,所以如果你使用分页,你需要确保它在你访问它之前被映射到虚拟内存中。 sgdt 在给定地址的低两个字节中存储 GDT-1 的大小,在接下来的四个字节中存储物理地址。

sgdt  dword [NewGDTPointer]

然后,如果 GDT 已经有用于 TSS 描述符的空白空间,您可以简单地将描述符放在那里。否则,您需要将 GDT 复制到更大的内存并加载新的。

关于c - 设置数据段后访问 GDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com