从用户应用程序访问 ring 0 模式(以及为什么 Borland 允许这样做)
Accessing ring 0 mode from user applications ( and why Borland allows this )
随着学期截止日期的临近,我决定开始在我的大学从事操作系统课程的项目。
项目作业的问题在于它要求学生开发一个用户应用程序 (exe
),它将作为一个简单的内核(基本进程和线程管理)执行。
我首先想到的是:我到底应该如何在用户应用程序中执行特权代码?
在咨询了其他学生(谁按时完成了项目)之后,我了解到他们能够使用 Borland 3.1 编译器毫无问题地执行特权代码。然而,none 的人觉得这很奇怪,也不知道为什么会这样。为什么(这里更好的问题是如何)Borland 这样做?这是否违反了 OS 安全的基本原则?
注意: 我添加了 C++ 标记,因为该项目应该作为 C++ 应用程序编写,大部分特权代码作为内联汇编执行。
更新 我的问题最初措辞有点不好。当然,我能够使用任何编译器使用特权指令编译代码 - 运行 代码就是问题所在。
编译器允许它,因为编译器的工作严格来说是将输入转换为编译后的输出。它并非旨在强加或强制执行任何系统安全规则。这是执行环境的工作,通常是 OS 或执行编译代码的模拟器。
两件事:
在 8086 实模式时代没有特权级别。 Borland 3.1 是一个 16 位编译器。如果您 运行ning 它在现代版本的 Windows 上生成的代码,它将 运行 使用 NTVDM 在虚拟 8086 模式下使用,它也没有特权级别。
即使在使用现代编译器/汇编器时,即使在保护模式和长模式下,它通常也不会抱怨特权指令。此源代码在 MSVC 2015 中对我来说编译得很好,但每当我 运行 它时崩溃,因为它试图访问一个对用户模式应用程序禁止访问的寄存器:
int main()
{
__asm
{
mov eax, cr0
or eax, 1
mov cr0, eax
}
return 0;
}
随着学期截止日期的临近,我决定开始在我的大学从事操作系统课程的项目。
项目作业的问题在于它要求学生开发一个用户应用程序 (exe
),它将作为一个简单的内核(基本进程和线程管理)执行。
我首先想到的是:我到底应该如何在用户应用程序中执行特权代码?
在咨询了其他学生(谁按时完成了项目)之后,我了解到他们能够使用 Borland 3.1 编译器毫无问题地执行特权代码。然而,none 的人觉得这很奇怪,也不知道为什么会这样。为什么(这里更好的问题是如何)Borland 这样做?这是否违反了 OS 安全的基本原则?
注意: 我添加了 C++ 标记,因为该项目应该作为 C++ 应用程序编写,大部分特权代码作为内联汇编执行。
更新 我的问题最初措辞有点不好。当然,我能够使用任何编译器使用特权指令编译代码 - 运行 代码就是问题所在。
编译器允许它,因为编译器的工作严格来说是将输入转换为编译后的输出。它并非旨在强加或强制执行任何系统安全规则。这是执行环境的工作,通常是 OS 或执行编译代码的模拟器。
两件事:
在 8086 实模式时代没有特权级别。 Borland 3.1 是一个 16 位编译器。如果您 运行ning 它在现代版本的 Windows 上生成的代码,它将 运行 使用 NTVDM 在虚拟 8086 模式下使用,它也没有特权级别。
即使在使用现代编译器/汇编器时,即使在保护模式和长模式下,它通常也不会抱怨特权指令。此源代码在 MSVC 2015 中对我来说编译得很好,但每当我 运行 它时崩溃,因为它试图访问一个对用户模式应用程序禁止访问的寄存器:
int main() { __asm { mov eax, cr0 or eax, 1 mov cr0, eax } return 0; }