问题标签 [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 投票
0 回答
255 浏览

x86-64 - x86_64 中的 GDTR 和分段

根据Intel® 64 and IA-32 Architectures Software Developer’s Manual 在 64 位模式中,分段通常(但不是完全)禁用,创建一个平坦的 64 位线性地址空间。这是否意味着 x86_64 CPU 中不需要/不存在 GDTR?

0 投票
0 回答
269 浏览

assembly - 为什么 MIT 的 JOS Bootloader 中的代码和数据段选择器是 0x8 和 0x10?

在关于引导加载程序的 MIT 课程部分中,以下代码用于设置内核代码段和数据段选择器:

完整的代码可以在这里找到。

这些特定的段选择器背后的含义是什么?为什么它们是 0x8 和 0x10?文档表明它们是“32 位代码段”。是什么让它们成为 32 位代码段?

0 投票
2 回答
147 浏览

process - 操作系统如何将进程彼此隔离?

假设 CPU 处于保护模式:

当一个 ring-0 内核建立一个 ring-3 用户空间进程时,它必须修改哪个 CPU 级别的数据结构以指示该特定进程可以访问哪个虚拟地址空间?

它是否只是将全局描述符表中所有其他内存段的特权位设置为(环)0?

0 投票
0 回答
137 浏览

assembly - LGDT 指令后重启并远跳转到保护模式

所以我遇到了一个问题,我现在似乎已经陷入了永恒,大约 3 天没有睡觉,现在试图自己解决这个问题,这对我来说有点令人沮丧,因为我觉得它应该老实说加载一个简单的表并执行远跳转到 32 位模式和繁荣是一项相对简单的任务!让它与我的数字快照一起工作。问题是每次我加载 GDT 并执行远跳时,我的计算机都会重新启动,正如我在许多其他帖子和处理相同问题的人中看到的那样。我使用'INT 0x13,AX = 0x20A'和'ES:BX = 0x1000:0'从我的引导加载程序加载。就在“CLI LGDT [GDT_END]”指令之前,如果我执行“JMP $”指令,它将成功打印有关已将其发送到内核的字符串。然而,

关于我可能做错的任何建议肯定会很可爱!花了几天时间,我似乎无法在任何地方找到并回答解决我的问题,尽管大量帖子似乎与同一个问题相似。这是我一遍又一遍地输入的内核代码,可能已经有几千次了……我试着让它看起来尽可能清晰,并尝试了所有我能找到的似乎对其他人有帮助的解决方案。这似乎是我最后的手段.. 如果需要引导加载程序,我也可以发布它,但是,就像我说的那样,它确实会在段:0x1000 偏移量:0 处加载到内核中。我通常从不使用 ORG,老实说不知道实际在做什么或正在做什么,我也找不到关于它的明确解释,但是无论有没有它,无论哪种方式,它都行不通。

编辑:我已将 JMP $ 更改为 INT 0x16 以使事情更简单。如前所述,它可以正常启动,但是在按键上是重新启动。我已将 ORG 更改为 0x1000 和 0x10000。我不确定如何在地址 0x7C00 加载而不将其附加到引导加载程序本身内部,但话虽如此,我也尝试在引导加载程序的末尾放置一个缓冲区标签并在其中加载内核,假设地址在引导加载程序为 0x7E00 并将其用作 ORG 之后。我也尝试过完全省略 ORG(因为它已经通过 DS 设置,不是吗?),然后将 0x8:FLOW_PROTECTED_MODE 更改为 0x8:FLOW_PROTECTED_MODE+0x10000。我还尝试过使用 JMP 0x8:$$+$ 以及其他许多东西。BOSHC 说的正是我所期望的 JMPF 0x8:0x00001065 无法解析。我假设内核实际上是在内存中的某个地方加载的,因为它确实说 Hello world!,但我一生都无法弄清楚如何正确找到该位置或问题是什么。

0 投票
1 回答
178 浏览

assembly - 如果 64 位架构中不存在 LDT,那么使用它的 32 位系统如何在 64 位架构上进行仿真?

我读到 LDT(本地描述符表)在 64 位架构中不存在,并且想知道如何模拟使用它的 32 位系统。

0 投票
0 回答
84 浏览

x86 - 初始加载后如何更新 GDT 条目?

一旦我使用 初始化并将我的 GDT 加载到 GDTR 中lgdt,我以后如何更新 GDT?
如果我使用sgdt命令获取基地址,然后更新或添加条目,然后再次使用lgdt? 还有其他方法吗?
或者我是否遗漏了一些东西并且 GDT 永远不会“意味着”在初始化和加载后更新?

0 投票
1 回答
139 浏览

assembly - 386的“D位”中的“D”代表什么?

GDT 的文章中, OSDev wiki 描述了用作 CS 描述符的 D 位的标志,如下所示:

Sz:尺寸位。如果为 0,则选择器定义 16 位保护模式。如果为1,则定义 32 位保护模式。您可以同时拥有 16 位和 32 位选择器。

另一个问题引用了英特尔手册:代码段描述符中的 D 标志对 x86-64 指令有什么作用?它链接到 Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3 [...]: System Programming Guide中的“3.4.5 Segment Descriptors”部分,阅读:

D/B(默认操作大小/默认堆栈指针大小和/或上限)标志

根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,该标志应始终设置为 1,对于 16 位代码和数据段,该标志应始终设置为 0。)

• 可执行代码段。该标志称为 D 标志,它指示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定 32 位地址和 32 位或 8 位操作数;如果清楚,则假定 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认以外的操作数大小,前缀 67H 可用于选择默认以外的地址大小。

问题是,“D”代表什么?

0 投票
0 回答
70 浏览

assembly - 为什么以以下方式加载 GDT 有效

我正在编写自己的内核并使用此代码覆盖引导加载程序设置的全局描述符表。这是在 32 位保护模式下完成的。

该代码工作正常,但是我无法理解为什么 lgdt 之后的下一条指令正确执行。

据我了解,段寄存器(尤其是 CS)的值保持不变。因此 CPU 将使用旧寄存器和新表来解析指令地址jmp 0x08:complete_flush。很有可能我的表中由旧 CS 的值指向的条目不是有效的代码段,这会导致崩溃。然而,没有这样的事情发生。为什么?

编辑:问这个是因为我的理解是 CPU 使用 CS:EIP 寄存器对解析线性地址。现在在lgdtCS 之后会突然指向不同的条目,所以为什么执行的下一条指令是 jmp 指令

0 投票
0 回答
686 浏览

assembly - 切换到 32 位保护模式后,引导扇区卡在 Qemu 中的“从硬盘引导”循环中

使用 qemu 运行我的代码,在调用之后switch_to_32_pm,Qemu 开始发疯并不断清除屏幕并显示“从硬盘启动”。-curses(我必须补充一点,由于某种原因我无法运行( -curses: curses or iconv support is disabled)(我真的应该切换到 linux ......)。

这是相关代码:

引导程序

gdt.asm

switch_to_pm.asm

0 投票
1 回答
374 浏览

linux - 全局描述符表(GTD)的现代用法是什么?

读了很久,真的很迷茫。从我读到的:

  1. 现代操作系统根本不使用段。

  2. GDT 用于在内存中定义一个段(包括约束)。

  3. 页表有一个主管位,指示当前位置是否用于内核。

  4. 维基百科说“GDT 仍然存在于 64 位模式;必须定义 GDT,但通常永远不会更改或用于分段。”

为什么我们需要它?以及linux如何使用它?