问题标签 [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.
assembly - PM中Selector和GDT是什么关系?
我浏览了网上关于全局描述符表的许多教程。但我找不到详细解释 64 位描述符中所有字段的站点。此外,我被 GDT 中的选择器概念所困扰。我知道选择器有一个索引,TI 是 GDT 还是 LDT 字段。简单来说,选择器与 GDT 的关系是什么?如果可能请详细解释。
谢谢..
assembly - A20线在保护模式下起什么作用?
我正在经历 x86 的保护模式部分。我刚刚了解了 GDT。之前,我研究过要进入保护模式(即:使用所有 32 位地址线)必须启用 A20 门。那么,启用 A20 的代码必须是 16 位的吧?最近浏览 wiki.osdev 站点时,发现启用 A20 的代码是用 x86 汇编编写的。X86 程序集产生无法在 16 位模式下加载的 32 位操作码,对吗?
如果可能,请解释。谢谢你。
memory-management - Linux内核设置GDT在哪里
我正在阅读 Linux 内核代码。我对 Linux 中的 GDT(全局描述符表)有一些疑问。
我的问题是:
为什么内核使用两步设置GDT?
如果我们使用 GRUB 作为引导加载程序,那么 GRUB 也会在 grub-core/kern/i386/realmode.S 中设置一个 GDT。为什么 Linux 会重置这个 GDT?
x86 - 为什么实模式应用程序不能在保护模式下运行?
我正在研究这种真实到保护模式的转换。我怀疑是否可以在不加载 ldt 和 idt 而是通过加载 gdt 的情况下实现真正的保护模式。一方面,第二个疑问出现了,为什么实模式程序不能在保护模式下运行而不转换到 v8086 模式?
谢谢
assembly - 使用 nasm 组装时程序显示错误
我修改了一个可用代码以使 a20 线切换到保护模式。但是在汇编代码时会弹出一个错误。
代码如下:
代码很简单,但是每当我在任何语句中使用内存 var_temp_a20 时都会弹出错误。
错误说明语句中的操作码或操作数不正确:
在整个程序中无处不在。
任何人都可以解释这个问题吗?
谢谢。
x86 - 设置全局描述符表和保护模式后不断重启
GDT setup
我一定是在和切换到时做错了,protected mode
因为它不断地重新启动。
这是我kernel.asm
应该设置GDT
并切换到protected mode
:
还有gdt.inc
:
我bootloader.asm
加载 10 个扇区0x1000:0x000
,然后跳到那里。
我使用以下命令测试代码:
我的错在哪里?
x86 - 线性寻址和 GDT
我很难设置 GDT 并切换到保护模式。主要是因为我对线性寻址不够了解。这是我的内核代码(kernel.asm):
这是gdt.inc:
还有我的引导程序(bootloader.asm):
我正在使用 Ubuntu LTS 14.04 32 位,我使用的命令是:
程序不断重启。
memory-management - 如果一个进程调用属于另一个进程的代码会发生什么?
如果一个进程调用一个属于另一个进程的远指针来执行代码会发生什么?
在 32 位操作模式下,GDT 的使用非常重要,分段可以充分使用。
那么,如果请求的 CS 指针指向另一个进程的段会发生什么?
有时这是允许的,我想。
但是,一般不是这样。
在 64 位模式下,分段被中途关闭。
所有段都从 0 运行到处理器线性空间的顶部。
此外,GDT 似乎被简单地使用了。例如,Linux 将所有进程中的所有用户代码放入一个段中。
系统代码也一样。
因此,在 64 位模式下,您甚至不需要远指针来调用另一个进程的代码。
也许我的问题可以归结为:
当一个进程试图调用另一个进程的代码时会发生什么?
x86 - 如何初始化 GDT?
我正在制作一个操作系统,但我被困在 GDT 上。我尝试了不同的教程,例如http://www.osdever.net/bkerndev/Docs/gdt.htm和http://www.jamesmolloy.co.uk/tutorial_html/4.-The%20GDT%20and% 20IDT.html,但我的操作系统总是崩溃。我怎样才能解决这个问题?我使用 grub,所以内核已经处于保护模式。
启动.asm:
内核.c:
链接器.ld:
生成文件:
内核生成文件:
x86 - 切换到保护模式后跳转到32位代码好像没有生效
经过与自己的多次辩论,我终于决定将我的操作系统移至保护模式。但是,我在执行保护模式代码时遇到了一些问题。OSDev wiki 上的第一步是启用 A20 线,由于快速门,我没有遇到什么麻烦。第二部分是加载全局描述符表。我遵循了 BrokenThorn Entertainment 教程并将其用作我的 GDT 的粗略基础,并将一些长二进制值转换为漂亮和短的十六进制值。最后,我将 cr0 寄存器的最低位设置为 1 以进入保护模式。然后我跳得很远0x08:start32
。然而,在执行我的代码并使用 qemu 的monitor -stdio
标志监视寄存器时,我看到了意想不到的结果。我的主要保护模式例程,start32
很简单。它将值移动0xDEADBABA
到eax
登记。然而,这似乎没有生效,因为在 QEMU 上,该值显示为00000100
. cr0 寄存器是00000010
,这似乎是正确的,但再次让我怀疑,因为它不是最低位。迄今为止最糟糕的是 GDT 寄存器,它等于精确00000000 00000000
. 这里有什么问题?我已经为我的引导扇区和我在下面切换到保护模式的内核部分提供了代码。
PS:bootsector清屏并加载内核。这是它的唯一目的。
start.asm(引导扇区):
kernel.asm(有问题的文件):