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

x86 - GDTR、LDTR、IDTR 和 TR 寄存器的大小是多少?

我在网上查了很多,每次都只能找到GDT、LDT和IDT的尺寸。

这里我不是在问表的大小,而是在问寄存器的大小

我知道 GDTR 是一个 64 位寄存器,但对其他寄存器一无所知。

0 投票
2 回答
170 浏览

assembly - 汇编程序 - 执行 LGDT 指令后 PC 崩溃

内容

我想在执行lgdt指令后用jmp指令跳转到diskette_initialisation,但是崩溃了是什么原因?如果知道原因,英特尔cpu的设计者为什么要这么做?

环境

  • cpu: 英特尔(r) 核心(tm) 17-8550U
  • 机器:虚拟盒子
  • 辅助存储:软盘
  • 编译器:2020 年 8 月 28 日编译的 NASM 版本 2.15.05

代码

0 投票
0 回答
67 浏览

linux - 何时何地 Linux 内核设置 GDT?

我对 linux 中的 GDT 有一些疑问。我尝试在内核空间(Ring0)中获取 GDT 信息,并在系统调用上下文中调用我的测试代码。在测试代​​码中,我尝试打印 ss 寄存器(Segment Selector),并通过 GDTR 和 ss-segment-selector 获取 ss 段描述符。

最让我困惑的是 ss-descriptor 中的“基本”字段都是零(line95 打印)。我尝试打印 __USER_DS 段描述符,“基本”字段也为零。

真的吗?Linux中的所有段都使用相同的基地址(零)?我想检查 Linux 源代码中的 GDT 初始化,但我不确定 Linux 何时何地设置 GDT?

我在“arch/x86/kernel/cpu/common.c”中找到这样的代码,GDT_ENTRY_INIT 的第二个参数(零)为零,这意味着段描述符中的 base0/base1/base2 字段都为零。

如果是这样,则所有段都具有相同的基地址(零)。这样一来,Ring0 和 Ring1 中的相同虚拟地址会映射到相同的线性地址吗?

我很感激你的帮助:)

0 投票
1 回答
88 浏览

x86 - 是否有关于如何布置全局描述符表条目的约定?

操作系统是否有一个约定的约定,指定每个表索引应该描述什么?例如,在 Windows 系统上(如此处所述),条目 4 描述32 位用户模式代码 ( RPL = 3),条目 6 描述了 64 位用户模式代码。这是一个约定吗?其他条目呢?

0 投票
1 回答
119 浏览

linux - Use of gs register on a 32 bit program over a 64 bit linux

In a 64 bit program the selector:offset used to get the stack protector is fs:0x28, where fs=0. This poses no problem because in 64 bit we have the MSR fs_base (which is set to point to the TLS) and the GDT is completely ignored.

But with 32 bit program the stack protector is read from gs:0x14. Running over a 64 bit system we have gs=0x63, on a 32 bit system gs=0x33. Here there are no MSRs because they were introduced in x86_64, so the GDT plays an important role here.

Dissecting this values we get for both cases a RPL=3 (which was expected), the descriptor table selector indicates GDT (LDT is not used in linux) and the selector points to the entry with index 12 for 64 bits and index 6 for 32 bits.

Using a kernel module I was able to check that this entry in 64-bit linux is NULL! So I don't understand how the address of the TLS is resolved.

The relevant part of the kernel module is the following:

Which outputs the following on a 64-bit system:

I haven't tried this module on a 32 bit system yet, but I'm on my way.

So, to make the question clear: how does the gs segment selector work in a 32-bit program running on a 64-bit linux kernel?

0 投票
1 回答
66 浏览

assembly - 为什么这个汇编代码不仅仅做 lgdt?

所以,我开始开发 x86_64 爱好内核,我发现这段代码可以加载 GDT(全局描述符表),但我不明白它的作用。

我知道它从 rdi 寄存器(sysv abi 中函数调用的第一个参数的寄存器)加载我的 gdt 描述符,但我不知道为什么我需要将所有段寄存器设置为 0x10 以及什么黑魔法在做什么?

0 投票
0 回答
36 浏览

assembly - 如何从实模式切换到保护模式

我要写一个简单的操作系统。从 16 位实模式切换到 32 位保护模式时发生错误。

加载 GDT 寄存器并设置 GDT 后,保护模式已成功开启。我想跳转到内存中的0x0地址但是失败了,GDT的信息显示有数千个GDT描述器。

'''

'''

这是调试信息: 在此处输入图像描述

0 投票
0 回答
46 浏览

windows - 汇编:如何在win7x64中使用段选择器?保护模式下 x64 中的 JMP FAR 或 CALL FAR

我知道32位保护模式是如何通过修改段选择器来实现跳转的,但是64位的情况和我想象的不一样。

我在 gdt 中写了描述符。他们都是一样的

我写了一个代码段描述符,其中选择器为 0x3b,其属性与默认的 0x23 选择器完全相同。

当我使用 jmp far: 0x3b: 有效地址访问时失败。步入前 步入 后:假

但是当我使用 jmp far 0x23:effective address 时,它成功了。成功使用 0x23

这个问题一直让我很困惑。我的机械信息是win7 x64。

我跳转到了ring3程序段的地址,这是一个合法的地址。

我的问题是为什么会失败?在XP-32上这样做没有问题,为什么win764会失败。如何正确跳跃。

0 投票
0 回答
23 浏览

assembly - 全局描述符表的位置如何影响程序?

我的代码如下所示:

我没有得到的是,如果我将全局描述符表放在不同的位置(特别是在跳远之前),则不会打印消息。为什么会这样?他使用 qemu 和 nasm。

0 投票
0 回答
18 浏览

assembly - 如果 gdt 被覆盖会怎样?为什么这不会发生?

在这个 gdt 中,我将代码和数据段设置为从地址 0 开始并占用整个 4gb 的内存。我猜该表存在于这个内存中的某个地方(我不太确定,但我猜它存储在前 512+0x7c00 个字节中,在我更改为 32 位模式之前由 bios 加载)。如果这是真的,我可以达到此地址(因为数据段设置为从地址 0 开始)