问题标签 [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.
x86 - GDTR、LDTR、IDTR 和 TR 寄存器的大小是多少?
我在网上查了很多,每次都只能找到GDT、LDT和IDT的尺寸。
这里我不是在问表的大小,而是在问寄存器的大小
我知道 GDTR 是一个 64 位寄存器,但对其他寄存器一无所知。
assembly - 汇编程序 - 执行 LGDT 指令后 PC 崩溃
内容
我想在执行lgdt指令后用jmp指令跳转到diskette_initialisation,但是崩溃了是什么原因?如果知道原因,英特尔cpu的设计者为什么要这么做?
环境
- cpu: 英特尔(r) 核心(tm) 17-8550U
- 机器:虚拟盒子
- 辅助存储:软盘
- 编译器:2020 年 8 月 28 日编译的 NASM 版本 2.15.05
代码
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 中的相同虚拟地址会映射到相同的线性地址吗?
我很感激你的帮助:)
x86 - 是否有关于如何布置全局描述符表条目的约定?
操作系统是否有一个约定的约定,指定每个表索引应该描述什么?例如,在 Windows 系统上(如此处所述),条目 4 描述了32 位用户模式代码 ( RPL = 3
),条目 6 描述了 64 位用户模式代码。这是一个约定吗?其他条目呢?
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?
assembly - 为什么这个汇编代码不仅仅做 lgdt?
所以,我开始开发 x86_64 爱好内核,我发现这段代码可以加载 GDT(全局描述符表),但我不明白它的作用。
我知道它从 rdi 寄存器(sysv abi 中函数调用的第一个参数的寄存器)加载我的 gdt 描述符,但我不知道为什么我需要将所有段寄存器设置为 0x10 以及什么黑魔法在做什么?
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会失败。如何正确跳跃。
assembly - 全局描述符表的位置如何影响程序?
我的代码如下所示:
我没有得到的是,如果我将全局描述符表放在不同的位置(特别是在跳远之前),则不会打印消息。为什么会这样?他使用 qemu 和 nasm。
assembly - 如果 gdt 被覆盖会怎样?为什么这不会发生?
在这个 gdt 中,我将代码和数据段设置为从地址 0 开始并占用整个 4gb 的内存。我猜该表存在于这个内存中的某个地方(我不太确定,但我猜它存储在前 512+0x7c00 个字节中,在我更改为 32 位模式之前由 bios 加载)。如果这是真的,我可以达到此地址(因为数据段设置为从地址 0 开始)