c++ - 从用户应用程序访问 ring 0 模式(以及为什么 Borland 允许这样做)

标签 c++ assembly borland-c++

随着学期截止日期的临近,我决定开始在我的大学从事操作系统类(class)的项目。 项目作业的问题在于它要求学生开发一个用户应用程序 (exe),它将作为一个简单的内核(基本进程和线程管理)执行。

我首先想到的是:我到底应该如何在用户应用程序中执行特权代码?

在咨询了其他学生(谁按时完成了项目)之后,我了解到他们能够使用 Borland 3.1 编译器毫无问题地执行特权代码。然而,他们都没有发现这很奇怪,也不知道为什么会这样。 Borland 为什么(这里更好的问题是如何)这样做?这不会违反操作系统安全的基本原则吗?

注意:我添加了 C++ 标记,因为该项目应该作为 C++ 应用程序编写,大部分特权代码作为内联汇编执行。

更新 我的问题最初措辞不佳。当然,我能够使用任何编译器使用特权指令编译代码——运行代码就是问题所在。

最佳答案

两件事:

  1. 在 8086 实模式时代,没有特权级别。 Borland 3.1 是一个 16 位编译器。如果您在现代版本的 Windows 上运行它生成的代码,它将使用 NTVDM 在虚拟 8086 模式下运行,NTVDM 也没有特权级别。

  2. 即使在使用现代编译器/汇编器时,即使在保护模式和长模式下,它通常也不会提示特权指令。这段源代码在 MSVC 2015 中编译得很好,但每当我运行它时就会崩溃,因为它试图访问用户模式应用程序禁止访问的寄存器:

int  main()
{
    __asm
    {
        mov eax, cr0
        or eax, 1
        mov cr0, eax
    }
    return 0;
} 

关于c++ - 从用户应用程序访问 ring 0 模式(以及为什么 Borland 允许这样做),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37448198/

相关文章:

c# - Dll将 C++ DLL 导入到 C# 应用程序中,BYTE * p

c++ - UML 中的 Const 函数规范

assembly - 8086 塔斯马 : Illegal Indexing Mode

assembly - 以下带有 FLDCW 指令的 x86 汇编代码有何作用?

c - 如何为 gcc 内联汇编获取 64 位整数的低位和高位 32 位? (ARMV5平台)

c++ - "Member function must be called or its address taken in function"C++错误

c++ - 使用 Borland C++ 编译器(5.5 版)的问题

c++ - 如何正确调用对齐的新/删除?

c++ - 如何在 C++ 中创建 "undo"?

c++ - 分离库的主机端和 CUDA 设备端版本