assembly 从用户应用程序访问环0模式(以及Borland允许此操作的原因)

yks3o0rb  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(109)

随着学期截止日期的临近,我决定在学校的操作系统课程中开始做一个项目。项目作业的问题是,它要求学生开发一个用户应用程序(exe),该应用程序将作为一个简单的内核(基本进程和线程管理)执行。
我脑子里首先想到的是:* 我该怎么在用户应用程序中执行特权代码 *
在咨询了其他学生(他们按时完成了这个项目)后,我了解到他们能够使用Borland 3.1编译器毫无问题地执行特权代码。然而,他们都没有发现这很奇怪,也不知道为什么会这样。Borland为什么(这里更好的问题是 * 如何 *)要这样做?这是否违反了操作系统安全的基本原则?

**注意:**我添加了C标记,因为项目应该作为C应用程序编写,大多数特权代码作为内联汇编执行。
更新我的问题最初措辞有些糟糕。当然,我能够用任何编译器编译带有特权指令的代码-运行代码才是问题所在。

dxxyhpgq

dxxyhpgq1#

两件事:
1.在8086实模式的时代,没有特权级别。Borland 3.1是一个16位编译器。如果你在32位版本的Windows NT上运行它生成的代码,它将使用NTVDM在虚拟8086模式下运行,NTVDM也没有特权级别。
1.即使使用现代的编译器/汇编器,它通常也不会抱怨特权指令,即使在保护模式和长模式下。这个源代码在MSVC 2015中编译得很好,但每当我运行它时就会崩溃,因为它试图访问用户模式应用程序禁止访问的寄存器:

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

bogh5gae2#

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

相关问题