问题标签 [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 - 我无法将 cpu 从实模式切换到保护模式
我是根据 Nick Blundell 的一本书来做的。我写了一个MBR程序,它首先在实模式下运行,程序中的一些指令会将cpu切换到保护模式。首先,我这样设置 GDT:
然后cpu运行以下指令:
该指令jmp CODE_SEG:init_pm
将导致cpu崩溃并重新启动。如果我将其更改为jmp init_pm
,则以下指令mov ax,10
将导致 cpu 崩溃并重新启动。而且书上说切换操作需要跳远。
你能帮我做切换操作吗?
gdb - gs的虚拟地址:0x14
如果我们用 gcc 编译一些 C 代码,我们经常会看到以下汇编结果
这是一个简单的函数序言。从 +19 行,我们可以看到堆栈保护器的值是从 gs:0x14 获得的。我的问题是,我可以用 gdb 知道 gs:0x14 的实际虚拟地址吗?gs 段选择器值表示与 GDT 的偏移量,但是,用户级进程(如 gdb)无法访问 GDT 信息。如何使用 gdb 或其他调试器找出 gs 段的基地址?这是不可能的吗?
先感谢您。
assembly - 了解引导加载程序代码以设置 A20 门
好的,我只是试图理解有助于访问 1Mb 以上内存的代码。我正在下面写所需的代码段。我会写我理解的,我只需要确认我理解的是否正确(我是自学操作系统)。提前致谢
seta20.1
首先,我们从键盘控制器 (mkbc) 获取状态,以检查是否可以向其写入内容。一旦它是空闲的,我们就会写入0xd1
它,它会进入它的缓冲区,最终将输出端口设置为 write 。
我们seta20.1
首先检查 mkbc 是否已读取并设置输出端口。完成后,我们发送0xdf
将设置 A20 门的数据,这最终将允许我们访问 1Mb 以上的内存。
我的理解对吗?如果不是,请在正确的地方纠正我。
assembly - 引导加载程序中的 gdt 远跳
我无法理解这段代码的作用。flush_gdt
是一个标签没问题,然后将指针lgdt [gdtr]
加载到寄存器中,然后从.48-bit
gdtr
jmp 0x08:complet_flush
jmp 指令有什么作用?然后为什么我们将 0x10 移动到 ax 然后再移动到其他寄存器
kernel - CPU是否忽略了gdt段?
我正在研究内核开发。使用一本书,我已经明白了。但是,我无法真正理解全局描述符表的影响。我的 GDT 如下:
加载gdt并将DATA_SEG分配给ds、ss、es、fs、gs寄存器后;我的汇编代码跳转到 c 代码。数据段基地址为 0x00000000,限制为 0xffff。不应该给 0x100000 内存地址赋值吗?
谢谢
assembly - x86 How to change gdt after it has been already loaded?
I have my idtr addressing defined as
and I can load it with LGDT [gdt_pointer]
.
But how can I change the contents of gdt later if I have to?
Can I use the LGDT
instruction again after setting the proper values?
EDIT: I'm planning to keep my gdt_pointer start address same all the time, but I'll be changing the size parameter. Also I'm loading and changing the gdt from 32 bit protected mode.
assembly - x86 中断服务程序导致一般保护错误
我的通用 isr 存根定义为:
每次中断都会调用此代码,如下所示:
这段代码适当地调用了外部处理方法,但是从外部处理方法返回后导致gpf中断。
此外,我已将我的 gdt 映射为使用 0 特权级数据和代码描述符(和空描述符)覆盖整个 4G 地址空间。任何帮助表示赞赏。
assembly - GDT 的粒度位在寻址内存方面到底有什么变化?
如果该位为零,那么内存是逐字节寻址的吗?如果它是 1,那么内存是 4Kb x 4Kb 寻址的吗?
例如,如果该位设置为 0,并且我寻址内存位置 a000h,那么我将寻址该位置的字节,对吗?如果我寻址下一个位置 a001h,那么那将是内存中的下一个字节,对吗?
但是如果这个位是 1,我会寻址 4Kb 块吗?
那么寻址a000h会给我一个4Kb的块,而a001是内存中的下一个4Kb吗?
assembly - 我可以在 gdb 下打印 gdtr 和 gdt 描述符吗?
不可见部分(x86),所以在 gdb 中我输入“p/x $gdtr”....等,但结果是“$6 = 值不能转换为整数”,在 gdb 中我输入“p/x $cs”唯一的结果是 CS,只是可见的部分
感谢您的回答
x86 - 在 GDT/LDT/IDT 输入上设置断点
我正在研究 x86 架构,我想在全局描述符表条目或解释描述符表条目或 ldt 上设置一个断点 - 这意味着,例如,每次从 idt/gdt/ldt 读取特定条目时将触发断点。
我正在尝试使用 bochs x86 模拟器来模拟这种情况,但是我很难做到。
谢谢。