x86处理器如何在引导加载程序加载GDT后立即获取指令?

2023-12-14

在为 x86 编写的典型简单引导加载程序中,我们有以下代码来加载 GDT 并执行远跳转(请注意,在执行以下代码之前 CS 为 0x0):

lgdt gdtdesc
movl %cr0, %eax
orl $1, %eax
movl %eax, %cr0

# Jump to next instruction, but in 32-bit code segment.
# Switches processor into 32-bit mode.
ljmp $0x8, $protcseg

.code32                                             # Assemble for 32-bit mode
protcseg:

然而,就在之后lgdtCS为null,指向GDT中的一个空描述符。所以 :

1.GDT加载后CPU到底如何才能取到正确的指令lgdt?

2.远跳转到的代码段的DPL通常为0,CPU在远跳转时是否进行权限检查?


在远跳转从 GDT 条目加载内部 CS 基础/限制/内容之前,您根本没有使用任何 GDT 条目。它不是really甚至是保护模式。

与启用分页(在写入 CR0 后,下一条指令的取指令将 CS:EIP 视为下一条指令中的虚拟)不同,直到写入段寄存器导致 CPU 实际从 GDT 读取之后,段填充才会发生。

CS 基地址不会被 LGDT 更改,并且您仍然处于操作数大小 = 地址大小 = 16 的最大特权级别,因此对ljmp指令就这样发生了。 (假设此代码片段在真实或虚幻模式下开始执行。)处于保护模式会影响将 CS 更新为8,但不影响获取和运行执行此操作的指令。

我不知道它是否算作 CPL=0 还是特殊情况,或者如果你的第一次远跳是调用门会发生什么。如果您想要更多,请看一下https://wiki.osdev.org/GDT_Tutorial和/或 Intel 或 AMD 的手册,或者也许其他人会回答这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86处理器如何在引导加载程序加载GDT后立即获取指令? 的相关文章

  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 如何在 GCC C++ 中编写多行内联汇编代码?

    这看起来不太友好 asm command 1 command 2 command 3 我真的必须在每一行加上双引号吗 另外 由于多行字符串文字在 GCC 中不起作用 我也无法欺骗它 我总是在互联网上找到一些例子 该人手动插入制表符和换行符而
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 在 x86 程序集中打印寄存器值的简单方法

    我需要在 8086 Assembly 中编写一个程序 接收来自用户的数据 进行一些数学计算并在屏幕上打印答案 我已经编写了程序的所有部分并且一切正常 但我不知道如何打印号码显示到屏幕上 在我所有计算结束时 答案是 AX 它被视为无符号 16
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 错误:无法识别的指令 [ORG]

    我试图编写一个引导加载程序以在 dos box 中使用 我写了下面的代码 BITS 16 tell the assembler that its a 16 bit code ORG 0x7C00 Origin tell the assemb
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • gem5 se模式如何执行具有操作系统依赖的程序?

    Gem5 se 模式是非操作系统模式 但我能够在其上执行 row hammer 代码 其中包含具有操作系统依赖性的命令 但是如果在 se 模式下没有操作系统 那么它们如何在 se 模式下执行 大多数用户态允许的指令只做通常的事情 即稍微改变
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • 运行单个 Java 线程的双核 CPU 利用率[重复]

    这个问题在这里已经有答案了 可能的重复 多线程 Java 应用程序能否很好地利用多核机器 https stackoverflow com questions 1649402 would a multithreaded java applic
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of

随机推荐

  • 将经度和纬度与 Intent 传递给另一个类

    我试图将纬度和经度从 MainActivity 中的 onLocationChanged 传递到另一个包com route provider classDataPrivider但我收到此错误 我该怎么做 我如何在 DataProvider
  • Res.download() 使用 html 表单提交,但不使用 Axios post 调用

    我正在编写一个小型应用程序 它将来自 React 应用程序的信息提交到 Express 服务器的 download API 然后将新文件写入本地文件系统 并使用 Express res download 在客户端下载新创建的文件 在 fs
  • Android 上的 Google 通讯录 api

    我已经这样做好几天了 我很困惑 我在很多地方读到谷歌提供的java客户端 无法在android上工作 但事实并非如此 有人能指出我正确的方向吗 public void onCreate Bundle savedInstanceState s
  • Python 中的单引号与双引号[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • IExtenderProvider 根据对象类型仅添加一些属性

    我遇到了一个问题 我不知道这是否确实可行 如果有一种 hacky 方式 我全力以赴 但我还没有找到 我有一个IExtenderProvider我用来拥有自己的组件UITypeEditor对于第三方控件的某些属性 由于显而易见的原因 我无法更
  • 我应该如何对多线程代码进行单元测试?

    到目前为止 我已经避免了测试多线程代码的噩梦 因为它看起来像是一个雷区 我想问人们如何测试依赖线程成功执行的代码 或者人们如何测试仅在两个线程以给定方式交互时才出现的此类问题 对于当今的程序员来说 这似乎是一个非常关键的问题 恕我直言 汇集
  • 为什么 macOS Visual Studio Code 使用错误的 Python 解释器?

    我在 macOS Sierra 10 12 6 上运行 VS Code 1 33 1 当我运行如下所示的简单 Python 程序时 VS Code 使用 Mac 上安装的 Python 2 7 而不是我使用 Homebrew 安装的 Pyt
  • 如何检查文件是否正在使用?

    在尝试打开文件进行读取之前 有什么方法可以先测试文件是否正在使用 例如 如果文件仍在写入或被视为正在使用 则此代码块将引发异常 try FileStream stream new FileStream fullPath FileMode O
  • REST-Endpoint:无返回值的异步执行

    我的问题可能很容易解决 但目前我不明白 在我的 Quarkus App 中 我有一个 REST Endpoint 它应该调用一个方法 不等待结果并立即返回 202 HTTP Statuscode POST Produces MediaTyp
  • Mysqli DELETE QUERY 在 PHP 脚本中不起作用

    我使用下面的代码从表中删除一个条目 我想做的是检查是否从表中删除了任何值 如果删除了一个值 脚本应该打印成功 否则为 false 这是我所实现的 直到现在请帮忙
  • 将声音从左向右移动

    如何将 iPhone 耳机的声音从左移到右 我认为你想要 AVAudioPlayer 的 pan 属性 检查AVAudioPlayer 文档 从 pan 属性 通过设置这个属性你可以 将声音放置在立体声场中 值 1 0 为全左 0 0 为
  • Matlab z buffer 用于模拟kinect

    我们正在尝试模拟简单的 kinect 输出 我已经在 Matlab 中渲染了一个三角形网格 现在我想获取渲染形状的图形 轴的深度缓冲区 我如何在 matlab 中做到这一点 即如何访问图形的深度缓冲区 你可以尝试this
  • IIS 上的 .htaccess 或 .htpasswd 等效项?

    有谁知道 IIS 是否有相当于 htaccess 和 htpassword 的文件 我被要求将一个应用程序迁移到 IIS 该应用程序使用 htaccess 根据 htaccess 文件的内容控制对各种 URL 中的文件集的访问 我进行了谷歌
  • 如何让.net cf中的所有进程都运行

    我想从我的应用程序中获取 Windows Mobile 6 5 中所有正在运行的应用程序的列表 谁能告诉我如何为CF做到这一点 你必须 P 调用工具帮助 API 曾经有一篇 MSDN 文章对此进行了介绍 将其全部放入此处的帖子中有点长 但也
  • 如何根据用户的选择动态生成SQL查询?

    我需要创建一个 GUI 用户可以使用它选择多个属性 这些属性将用于查询数据库以找到合适的人 我正在寻找如何根据用户的选择动态生成数据库查询的想法 查询将包含多个字段 但为了了解这个想法 我将仅包含以下三个字段作为示例 职业 可以有 0 到
  • Spring cloud Stream中的事务

    Problem 我正在尝试逐行读取一个大文件并将消息放入 RabbitMQ 中 我想在文件末尾提交rabbitMQ 如果文件中的任何记录是坏的 那么我想撤销发布到队列的消息 技术 弹簧靴 春云流水 RabbitMQ 您能帮我实现这个过渡吗
  • 在.NET 中读取/保存 PixelFormat.Format48bppRgb PNG 位图?

    我已经能够使用以下 C 代码创建 Format48bppRgb PNG 文件 来自一些内部 HDR 数据 Bitmap bmp16 new Bitmap viewer Width viewer Height System Drawing I
  • 如何在 Linux 中从 C 获取当前时间(以毫秒为单位)?

    如何获取 Linux 上的当前时间 以毫秒为单位 这可以通过使用来实现POSIX clock gettime功能 在当前版本的 POSIX 中 gettimeofday is 标记为过时 这意味着它可能会从规范的未来版本中删除 鼓励应用程序
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • x86处理器如何在引导加载程序加载GDT后立即获取指令?

    在为 x86 编写的典型简单引导加载程序中 我们有以下代码来加载 GDT 并执行远跳转 请注意 在执行以下代码之前 CS 为 0x0 lgdt gdtdesc movl cr0 eax orl 1 eax movl eax cr0 Jump