问题标签 [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.

0 投票
1 回答
702 浏览

assembly - 加载 GDT 后

我无法理解这段代码的作用。为什么在加载 GDT 后将 mov $0x10 移动到 cx 然后再移动到其他寄存器?ljmp 指令有什么作用?

0 投票
1 回答
290 浏览

assembly - 英特尔平板内存模型

在英特尔平面内存模型中,总是使用 2 个 GDT 索引,CODE 段,DATA 段,我可以在平面内存模型中使用更多的 GDT 索引吗?我的要求是拥有一个带有 RO 的内存区域,该区域现在位于数据段中。

0 投票
1 回答
331 浏览

assembly - 在 x86 上简化 GDT 时遇到问题

我正在尝试简化包含 6 个段的 GDT 表,但其中 2 个段是真正必要的(根据我收集的内容)。我无法使更改生效。

代码来自克伦威尔,一个 Xbox(原始)引导加载程序。CPU 是 Pentium III 。没有用户空间的概念,所以一切都应该在权限级别为 0 的段上运行。我想从一个具有单个 code32 和单个 data32 段的平面模型开始。

这是相关的原始工作代码:

将上面代码中的远跳转更改为

顺便说一句,也可以正常工作。

如您所见,保护模式在开始时启用。

我想修剪 GDT 在 0x08 处有一个 code32 段,在 0x10 处有一个 data32 段。这是我对此的看法;这不起作用:

任何人都可以发现为什么它不起作用?

我自己无法找到答案的额外问题:

  1. 首先,在“tableGdtDescriptor:”处,限制值(第一个单词)不应该是表格的大小 - 1 吗?那么这里的值应该是“tableGdtDescriptor-tableGdt - 1”吗?如果是这样,为什么它在原始代码中工作?(我的假设是这个值是任何超过 47 字节(6 段 - 1 字节)的值都会恢复到 47 字节。
  2. 如果紧接着强制 16 位对齐,为什么“tableGdtDescriptor”字段在末尾有填充?似乎没有必要。纯粹是为了好习惯?
  3. 为什么 FS 和 GS 被清除,而不是设置为与 SS、DS 和 ES 相同的值?所有在线示例都将这些寄存器设置为相同的段偏移量。为什么这里做的不一样?
0 投票
1 回答
345 浏览

x86 - 段描述符中 AVL 位的用途是什么?

GDT 中的 AVL 位是做什么用的?除了“供软件使用,硬件不使用”之外,维基百科没有提供任何我能找到的信息。

0 投票
1 回答
72 浏览

x86 - 如何区分细分类型?

不同类型的细分如何被识别为不同?维基百科指出:

段可以定义为代码、数据或系统段

它还指出:

第 12 位清除的描述符是“系统描述符”,用于特殊目的。

所以,我推测这个“系统位”是用来识别系统段的,但是代码和数据段呢?此外,由于这些标识符是单独存储的,而不是作为单个 2 位值存储的,您能否获得组合类型,如系统代码和系统数据段?

0 投票
2 回答
82 浏览

x86 - 是否有多个 LDT?

以下Wikibooks 页面指出:

GDT 包含指向每个 LDT 的指针。

我目前正在学习分段,这意味着有多个 LDT。据我所知,只有一个:我读过的多个参考文献都提到了“LDT”,暗示只有一个。引用页面的含义是否正确?这是否意味着“LDT条目”?

0 投票
1 回答
77 浏览

x86 - 为什么段描述符的第 11 位和第 12 位不组合在一起?

关于定义的问题:英特尔 64 和 IA-32 架构软件开发人员手册,第 3A 卷,在第 5.2 节中总结了段描述符字段。为什么“类型”字段被定义为第 8 位到第 11 位,而不包括第 12 位,它被简单地称为“描述符类型标志”?考虑到第 11 位和第 12 位一起用于确定段是代码、数据还是系统段,将它们组合在一起不是更合乎逻辑吗?

0 投票
1 回答
68 浏览

x86 - 一个段可以有多个段描述符吗?

是否可以为单个段使用多个段描述符,以便在该段中为不同的特权级别提供单独的权限?例如,允许环 2 通过一个描述符读取或写入数据段,然后允许环 3 通过另一个描述符对该段进行只读访问?

0 投票
0 回答
165 浏览

64-bit - 使用呼叫门进行振铃转换

我正在尝试使用调用门而不是 SYSRET 和 SYSENTER 执行环 3 到环 0 的转换,以查看调用门如何在 IA-32e(64 位)处理器上工作。

我所知道的是呼叫门是您可以放入 GDT 的特殊结构,因此可以使用它来执行不同环之间的转换。

调用门的结构是这样的:

我设置了一个windbg 远程Windows 内核调试器。现在假设我的调度例程(处理器从环 3 转移到环 0 后我想要去的位置)位于,0xfffff8027f258bc0所以我在这个位置放置了一个硬件断点:

现在我使用以下信息创建了一个调用门结构:

  • DPL:0x3
  • 选择器:0x10 (KGDT64_R0_CODE)
  • 类型:0xc
  • p(现在):0x1
  • 并附加 offset0_15 和 offset16_63 : fffff8027f258bc0

结果结构(十六进制)是这样的:

现在,调用门(和每个 GDT 条目)都是 128 位或 0x10 字节。我选择 GDT 的第 8 个条目将其转换为调用门,因此首先使用 GDTR 找到 GDT 位置,然后修改其第 8 个条目(第 0x8 个条目 * 每个条目的 0x10 大小)。

是时候使用 far call 或 far jmp 来使用我们的条目了。我的用户模式应用程序(希望将执行转移到环 0)执行以下指令:

但问题是什么也没有发生,用户模式应用程序既没有崩溃也没有将执行转移到环 0(因为我的硬件断点没有触发。)。

现在我的问题是,我的假设有什么问题导致问题从环 3 转移到环 0?

更新:我还测试了 0x40 和 0x43 作为 far jmp 的选择器。

0 投票
1 回答
333 浏览

assembly - 英特尔汇编命令“sgdt”返回哪个段描述符

我想为应用程序实现 32 位 4Gb 平面内存映射,为此我必须获取和更新数据段描述符和代码段描述符。通过使用汇编命令“sgdt”,我可以获得全局描述符表,但我不确定它是 CS 还是 DS 或任何其他描述符。如果有人可以帮助我解决这种困惑,将不胜感激。

我依靠 GRUB 来设置 GDT,这就是为什么我不知道它放置所有段描述符的确切位置。通过查看 GDT 表条目,我可以看到 5 个相同的代码段条目和 6 个相同的数据段条目,每个条目的基地址设置为“0”,每个设置的限制为“0xfffff”。你能告诉我这些重复条目的原因吗?从这些观察中,您能否确认 GRUB 已经设置了 Flat Memory 模式?