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