我从操作系统和硬件的角度了解实模式和保护模式之间的区别。
但我想弄清楚程序“了解”实模式或保护模式什么?在查看源代码/目标代码时如何判断它是否是实模式程序?
寻找答案时,我能想到的只是“实模式”程序使用 BIOS 子例程和操作系统子例程,而“保护模式”程序仅使用操作系统子例程。指令代码不同,因为寄存器的操作码不同并且偏移地址的长度不同。还有其他功能可以区分实模式程序和保护模式程序吗?
“实模式”程序使用 BIOS 子例程和操作系统子例程,而“保护模式”程序仅使用操作系统子例程。
指令代码不同,因为寄存器的操作码不同并且偏移地址的长度不同。
主要区别在于CPU所处的模式。在保护模式下,操作系统可以使用分页和虚拟内存等功能。此外,实模式代码绝不是 32 位,而保护模式代码可以是 16 位或 32 位。每个 x86 cpu 都以实模式启动,操作系统必须切换到保护模式。
在查看源代码/目标代码时如何判断它是否是实模式程序?
如果物理内存和虚拟内存之间存在直接映射(一对一),则程序正在实模式下执行。更准确地说,由于虚拟内存在实模式下未激活,因此程序以 16 位模式执行,其中源代码/目标代码“查看”的每个地址都是 RAM 上的实际物理地址。
另一方面,保护模式启用了虚拟内存功能。因此,源代码/目标代码访问的地址之间的映射与 RAM 中访问的实际内存位置不同。
要检测这一点,您只需在执行源代码/目标代码时检查 CPU 中的分页标志是否启用或禁用即可。
对于基于x86的CPU,您可以检查CR0寄存器中的值。如果 CR0 寄存器为空,则程序运行在实模式。
当BIOS初始化引导加载程序时,它工作在实模式下。引导加载程序的工作是当内核工作在保护模式时从实模式切换到保护模式。