从用户应用程序访问 Ring 0 模式(以及 Borland 允许这样做的原因)

2024-01-12

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

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

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

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

Update我的问题最初措辞有些糟糕。当然,我能够使用任何编译器使用特权指令编译代码 - 运行代码是问题所在。


两件事情:

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

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



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

从用户应用程序访问 Ring 0 模式(以及 Borland 允许这样做的原因) 的相关文章

随机推荐