- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是一个非常愚蠢的问题,但我似乎无法解决它。在我的操作系统中,GDT 是通过与内核链接的汇编代码设置的。当发生这种情况时,当然会在加载 GDT 时设置数据段和代码段。此信息在汇编代码中存储为
GDT_Contents db 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 154, 207, 0, 255, 255, 0, 0, 0, 146, 207, 0
所有段都设置得很好,但是我无法通过指向 GDT_Contents 的指针访问 GDT。我已经用几种方法对此进行了测试,主要是通过创建一个指向 0(即 GDT_Contents 的位置)的指针并回显它们的字节。它们与 GDT_Contents 不匹配。我很确定这是因为当 GDT 被加载时,它是相对于先前的数据段(0x0 或由引导加载程序设置,我不确定)。但无论如何,我现在不知道如何访问 GDT,我想设置 TSS 我不能将它硬编码到 GDT_Contents 中,因为它需要指向我的 TSS 结构的指针。我认为这与恢复以前的数据段一样简单,但我不知道该怎么做。这是设置GDT的汇编代码
cli
mov dword [MultiBootInfo_Structure], EBX
add dword EBX, 0x4
mov dword EAX, [EBX]
mov dword [MultiBootInfo_Memory_Low], EAX
add dword EBX, 0x4
mov dword EAX, [EBX]
mov dword [MultiBootInfo_Memory_High], EAX
mov dword ESP, Kernel_Stack
mov dword [_NATIVE_GDT_Pointer + 2], _NATIVE_GDT_Contents
mov dword EAX, _NATIVE_GDT_Pointer
lgdt [EAX]
mov dword EAX, 0x10
mov word DS, EAX
mov word ES, EAX
mov word FS, EAX
mov word GS, EAX
mov word SS, EAX
jmp 8:Boot_FlushCsGDT
Boot_FlushCsGDT:
mov dword [_NATIVE_IDT_Pointer + 2], _NATIVE_IDT_Contents
mov dword EAX, _NATIVE_IDT_Pointer
lidt [EAX]
mov dword EAX, CR4
or dword EAX, 0x100
mov dword CR4, EAX
mov dword EAX, CR4
or dword EAX, 0x200
mov dword CR4, EAX
mov dword EAX, CR0
and dword EAX, 0xFFFFFFFD
mov dword CR0, EAX
mov dword EAX, CR0
and dword EAX, 0x1
mov dword CR0, EAX
call __ENGINE_ENTRYPOINT__
Boot_FlushCsGDT.loop:
cli
hlt
jmp Boot_FlushCsGDT.loop
ret 0x0
当然这是 32 位保护模式下的 x86。
最佳答案
使用sgdt
指令获取GDT的大小和地址。这是一个物理地址,所以如果你使用分页,你需要确保它在你访问它之前被映射到虚拟内存中。 sgdt
在给定地址的低两个字节中存储 GDT-1 的大小,在接下来的四个字节中存储物理地址。
sgdt dword [NewGDTPointer]
然后,如果 GDT 已经有用于 TSS 描述符的空白空间,您可以简单地将描述符放在那里。否则,您需要将 GDT 复制到更大的内存并加载新的。
关于c - 设置数据段后访问 GDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290372/
如果该位为零,那么内存是逐字节寻址的?如果是1,那么内存是按4Kb×4Kb寻址的? 例如,如果该位设置为 0,并且我寻址内存位置 a000h,那么我将寻址该字节在那个位置对吧?如果我寻址下一个位置a0
这是一个非常愚蠢的问题,但我似乎无法解决它。在我的操作系统中,GDT 是通过与内核链接的汇编代码设置的。当发生这种情况时,当然会在加载 GDT 时设置数据段和代码段。此信息在汇编代码中存储为 GDT_
前言 所谓工作模式,是指CPU的寻址方式、寄存器大小、指令用法和内存布局等。 实模式 段基址:段内偏移地址”产生的逻辑地址就是物理地址,即程序员可见的地址完全是真实的内存地址。 保护模式 在保护模式中
我有一个引导加载程序,它正在为我设置 GDT。是否可以找出这个 GDT 的地址以便我可以使用它? 最佳答案 当然,只需使用 sgdt 指示读取当前设置。 关于assembly - 是否有可能获得 GD
使用 lgdt 初始化 GDT 并将其加载到 GDTR 后,稍后如何更新 GDT? 如果我使用 sgdt 命令获取基地址,然后更新或添加条目,然后使用 lgdt 再次重新加载,我是否正确?还有其他方法
我目前正在使用 x86 Assember,以提高我的低级编程技能。目前,我在 32 位保护模式下的寻址方案遇到了一个小问题。 情况如下: 我在 0x7e0 加载了一个程序,它将 CPU 切换到保护模式
在bootasm.S .p2align 2 # force 4 byte alignment gdt: SEG_NULLASM
flush_gdt: lgdt [gdtr] jmp 0x08:complete_flush complete_flush: mov ax, 0x10 mov ds,
在bootasm.S .p2align 2 # force 4 byte alignment gdt: SEG_NULLASM
GDT如何反射(reflect)在进程的线性空间上(如果我没理解错的话,GDTR包含page和offset)。?或这个问题的另一个版本:GDTR 对于每个进程都是唯一的。? 最佳答案 只有一个 GDT
我正在开发一个小型操作系统,它将为每个进程使用单独的本地描述符表。我知道我需要使用 lldt从我的 GDT 加载 LDT 段的指令。我已经让我的内核以有效的 GDT 以保护模式运行,但我无法弄清楚我的
我主要使用 C++ 制作操作系统,但对于引导加载程序,我使用 FASM。当我尝试设置 GDT 时,Qemu 清除屏幕并在顶部重新打印“SeaBIOS”。它会继续这样循环,直到我关闭它。这是它的动图:
我正在编写一个简单的自制 64 位操作系统,通过 UEFI 启动它。这意味着当我的代码开始执行时,它已经处于长模式,并且启用了分页。 现在,退出 UEFI 引导服务后,我想用我自己的控制结构替换 UE
在我开始之前,这里提到的所有代码都在运行@ring0(内核模式)- OSX 10.9: 以下函数崩溃: UINT64 GetGdtBase() { UINT64 gdt = 0; as
我正在尝试使用 Eclipse (Neon) 在 C++ 中运行一个非常简单的 GUI 应用程序:程序启动,显示红色并在 10 秒后自行关闭。 为了实现这一点,我正在运行 Allegro 5.0.10
这个问题的灵感来自多年来许多人遇到的问题,尤其是在 x86 操作系统开发中。最近一个related NASM question被编辑撞了。在那种情况下,该人使用 NASM 并收到组装时间错误: shi
据我了解,这两个表都包含段描述符,提供每个段的访问详细信息,包括基地址、类型、长度、访问权限...等。 看着这个blog差异描述如下: 1. GDT在系统中只有一份,而LDT可以有多个 2. GDT在
我是系统架构的入门级学生,准确地说是intel x86。目前我正在阅读 Intel 的手册 (1,3a,3b,3c),但我被困在分段部分。 据我所知,在保护模式下,系统正在将逻辑内存转换为线性内存(或
I want to use gdb to see my GDTR/LDTR/TTR and segment register 不可见部分(x86) 所以在 gdb 中我输入“p/x $gdtr”...
我是一名优秀的程序员,十分优秀!