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

时间:2016-05-25 21:47:52

标签: c++ assembly borland-c++

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

首先出现在我脑海中的是:我该如何在用户应用程序中执行特权代码?

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

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

更新我的问题原来措辞有点差。当然,我能够使用任何编译器使用特权指令编译代码 - 运行代码是问题。

2 个答案:

答案 0 :(得分:6)

两件事:

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

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

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

答案 1 :(得分:5)

编译器允许它,因为编译器的工作是严格地将输入转换为编译输出。它的目的不是强加或强制执行任何系统安全规则。这是执行环境的工作,通常是执行编译代码的操作系统或模拟器。