首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否在设置数据段后访问GDT?

是否在设置数据段后访问GDT?
EN

Stack Overflow用户
提问于 2013-01-12 12:55:49
回答 1查看 241关注 0票数 2

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

代码语言:javascript
复制
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或由bootloader设置的,我不确定)。但不管怎么说,我现在不知道如何访问GDT,我想设置TSS我不能直接将其硬编码到GDT_Contents中,因为它需要一个指向我的TSS结构的指针。我认为这和恢复之前的数据段一样简单,但我不知道如何才能做到这一点。这是设置GDT的汇编代码

代码语言:javascript
复制
    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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-16 07:42:29

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

代码语言:javascript
复制
sgdt  dword [NewGDTPointer]

然后,如果GDT已经为TSS描述符留出了空闲空间,则只需将该描述符放在那里即可。否则,您将需要将GDT复制到更大的内存中并加载新的内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14290372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档