问题标签 [gdt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
intel - 为什么 GDT 不被视为一个段?
除了构成程序或过程的执行环境的代码、数据和堆栈段之外,该体系结构还定义了两个系统段:任务状态段 (TSS) 和 LDT。
GDT 不被视为一个段,因为它不是通过段选择器和段描述符访问的。TSS 和 LDT 具有为它们定义的段描述符。
-- Intel 64 和 IA32 架构软件手册 3A,2.1.2
我对为什么不将 GDT 视为一个部分感到困惑。
谁能给个详细的解释?
memory - What's the meaning of this?(size and offset)
Loading/Storing
The IDT is loaded using the LIDT assembly instruction. It expects the location of a IDT description structure:
The offset is the virtual address of the table itself. The size is the size of the table subtracted by 1. This structure can be stored to memory again with the SIDT instruction.
assembly - 是否有可能获得 GDT 的地址?
我有一个为我设置 GDT 的引导加载程序。是否有可能找出这个 GDT 的地址以便我可以使用它?
c - 设置数据段后访问 GDT?
这是一个非常愚蠢的问题,但我似乎无法解决它。在我的操作系统中,GDT 是通过与内核链接的汇编代码设置的。发生这种情况时,当然数据段和代码段是在加载 GDT 时设置的。此信息存储在汇编代码中为
所有段都设置得很好,但是我无法通过指向 GDT_Contents 的指针访问 GDT。我已经测试了几种方法,主要是通过创建一个指向 0(即 GDT_Contents 的位置)的指针并回显它们的字节。它们与 GDT_Contents 不匹配。我很确定这是因为当 GDT 被加载时,它是相对于先前的数据段(0x0 或由引导加载程序设置的,我不确定)。但无论如何,我现在不知道如何访问 GDT,我想设置 TSS,我不能将其硬编码到 GDT_Contents 中,因为它需要指向我的 TSS 结构的指针。我认为这就像恢复以前的数据段一样容易,但我不知道该怎么做。这是设置 GDT 的汇编代码
当然,这是 32 位保护模式下的 x86。
gdt - 如何在全局描述符表中创建两个单独的段
我已经了解了全局描述符表 (GDT) 的基础知识,并且我已经使用 asm 成功编写了一个“GDT.inc”,以便我们可以轻松地将它包含在我们的引导加载程序中。作为一个婴儿步骤,我已将代码描述符和数据描述符配置为从第一个字节读取和写入内存中的字节 0xFFFFFFFF(内存中的任何部分)
现在我的目的是使用 GDT 创建两个单独的区域。例如,第一个 512B 作为一个区域,下一个 512B 作为另一个区域,并留下未使用的空间。
我能做些什么呢?
x86 - GDT 分段内存
我正在尝试构建自己的内核,现在正在设置 GDT。我为加载程序使用了一个程序集文件,并调用了用 C 编写的内核,并试图让 GDT 工作。内核从 GRUB 引导并通过 GRUB 刷新 GDT 设置。当我将 GDT 条目设置为段(具有适当的限制和偏移量)时,我假设在 QEMU 以及当我从 pendrive 启动时,内核重新启动时都会出现三重故障。
我的问题是:
我可以为 x86 架构实现分段模型吗?是否需要在保护模式下完成?工作完成后如何退出保护模式?
我会在此处发布代码,但其中大部分来自教程,如果我将程序集和 C 代码混在一起,它会变得一团糟。主要的是,如果我在 C 内核中将代码段和数据段条目的基础都设置为“0”之外的任何其他操作,内核就会重新启动。此外,当我将粒度设置为禁用 4KB 分页时,也会发生同样的事情。如果需要,请询问更多详细信息。谢谢 :) :)
编辑:这是我用于链接 asm 引导加载程序和 C 内核文件的 linker.ld 文件。我已经发布了与内存分段相关的 asm 和 C 文件中的段:
链接器:
用于设置 GDT 和实例化函数的 C 函数:
最后,用 ASM 编写的 GDT 刷新函数:
我知道 C 函数和 ASM 是正确的,因为它们适用于平面内存模型。我需要对此进行任何具体更改吗?我想就链接器文件提供一些建议以设置分段或分段分页。
protected-mode - GDT中DC位的作用是什么?
这是我的代码:
当 gdt 中的 dc 位(访问字节的第三位)为零时,它可以正常工作。我想知道为什么当它是 1 时不工作?
我知道 dc 位是数据选择器的 Direction 位,当它为 0 时,该段长大,当它为 1 时,该段长大。但不知道长大和长大到底是什么意思。当我想使用堆栈时,成长和成长对我来说意味着。(ESP++和ESP--)
assembly - 如何找出 GDT 的内容
我正在分析一个反汇编的dll并卡在了线上
我想找出用这条指令写入 ebx 的数据的确切物理地址。gdb 告诉我fs = 0x53.
我已经发现地址取决于模式(受保护的或真实的),而且我很确定 CPU 处于保护模式(请参阅*)。所以段 fs 的开始应该存储在 GDT 中的某个地方,对吗?我还找到了 的地址GDT-register (0x009bd5c0007f)
,但是 gdb 不允许我访问或读取寄存器,所以我不知道如何找出 fs 的物理地址(因此,fs:[00000004h]
)。
有人可以帮我吗?
我使用了指令smsw ax
,然后eax
是 0x280031。所以最后一位是1,表示保护模式。我做对了吗?
gdt - xv6-rev7 (JOS) GDT
我很难理解 JOS (xv6-rev7) 中的 GDT(全局描述符表)
例如
为什么要右移 12?为什么和 0xffff?
这些数字是什么意思?
公式是什么意思?
谁能给我一些资源或教程或提示?
在这里,这是我的问题的两部分代码片段。
第一部分
第二部分
完整部分: http: //pdos.csail.mit.edu/6.828/2012/xv6/xv6-rev7.pdf
assembly - 带 JOS 的 A20 线
下面的代码片段是为 JOS 启用 A20。它有一个让我感到困惑的问题。“$0xdf”是一个命令,而不是数据。它应该输出到端口 0x64,这是命令端口。实际上,它的端口是0x60,也就是数据端口。在这里,存在两种方法(方法 3.1 和方法 3.2): http ://www.brokenthorn.com/Resources/OSDev9.html
所以,我的问题是:为什么最后要移植到 0x60 (outb %al, %0x60) ?