我有一个关于用低级语言编写的程序如何工作的问题。假设我编写了一个 C 程序,它将读取一个文件并将其内容输出到控制台。它将如何执行?
我理解正确,在启动时,它的代码将被发送到处理器执行?处理器将按顺序从 RAM 中检索代码并逐个命令执行。如果是,系统如何控制访问权限?如何限制仅对特权用户可用的命令的执行?
什么会阻止以没有特殊权限的用户身份运行的代码命令处理器直接访问硬盘,获取只有 root 用户可以访问的数据,如果没有更改的代码直接执行到处理器,则处理并覆盖它?
也许有某种观察者可以确保程序不执行禁止的操作?而如果有这样的观察者,真的有可能只通过它就可以接触到任何设备吗?
例如,如果我的程序由对某些系统文件没有读取权限的用户运行,系统如何防止处理器上运行的代码访问硬盘并读取/覆盖这些系统文件?
如果我没有正确理解机器代码的执行方式,请解释权限限制机制的工作原理或纠正我。
简而言之,处理器具有只能以高优先级执行的指令列表。并且用户任务由操作系统以低优先级启动。因此,当您尝试直接从任务中获取内存以外的其他内容时,或者当您尝试直接从任务中获取端口时,将发生异常并且控制权将返回给操作系统。
UPD1:
是的,试图进入别人的内存不是受命令的优先级限制,而是受所谓的内存管理单元(MMU-Memory Management Unit)的限制。每个任务都分配了一块内存,而这块内存的边界写在 MMU 中。每次访问内存时,MMU 都会在硬件中控制这些边界。当试图在分配的边界之外进行写/读时,MMU 会产生一个异常并且控制权将回退到操作系统。而对于访问端口的命令,只能从高优先级的任务中启动。
UPD2:
由于该任务不能直接访问磁盘控制器的端口,所以它被迫向操作系统执行所谓的系统请求。读取文件时,程序调用文件系统驱动程序(然后调用磁盘驱动程序)。磁盘驱动程序以内核优先级(或驱动程序优先级)运行,并被允许访问磁盘控制器寄存器。当程序需要在屏幕上显示某些内容或访问网络或 USB 端口时,程序也会到达(向操作系统执行系统请求,即所谓的系统调用)。由于控制权转移到操作系统,操作系统可以分析该程序的所有权限级别并执行请求,如果权限不足,或者说系统文件在此级别不可用,则拒绝执行请求用户。
UPD3:
是的,所讨论的优先级不是操作系统中进程和线程的优先级。这些是处理器中的硬件优先级。在不同的架构中,这是以不同的方式组织的。有时这是两个级别 - 主管和用户/用户。有时存在三个级别 - 主管、驱动程序和用户/用户。并且操作系统中进程和线程的优先级与处理器中存在的硬件优先级是分开存在的。
UPD4:
老实说,我不知道哪里有关于这个主题的好评。但他们肯定在某个地方,试着用谷歌搜索一下。我自己在裸机上对没有任何操作系统的控制器进行了很多低级编程。为此,我必须阅读处理器的数据表。我的知识就是从那里得到的。但是,我不能向其他人推荐这条路径,因为处理器的典型数据表包含 500-1000-1500 页的英文。
实际上,对于不编写驱动程序或将 Unix 移植到新处理器的普通程序员来说,所有这些科学都毫无用处。了解系统的内部结构当然对整体开发很有用。但是对于一个应用程序员的实际工作来说,知道他分配了代码内存、数据内存、堆,还有对操作系统的请求被处理并返回结果和错误码就足够了。
UPD5:
我看到答案越来越受欢迎。好吧,我会加两分钱。有些处理器没有对内存管理的硬件支持(即没有 MMU),并且没有将操作模式分为主管模式和用户模式。这些处理器设计用于所谓的嵌入式系统(embedded systems),其中没有磁盘支持,没有硬件支持交换(传统上由同一个 MMU 提供),在运行过程中不加载新任务,并且所有任务最初都在 ROM 中工作。例如,Microchip 的 PIC 处理器、Analog Device 的信号处理器等等。但是有些处理器面向通用操作系统,如 Windows 和 Linux,完全支持多任务和多用户。这些处理器必须同时具有 MMU 和主管/用户模式的划分。这些处理器首先包括来自英特尔的 x86、受到智能手机制造商喜爱的 ARM,以及更多不同程度的知名度和商业成功的处理器。
UPD6:
@Pavel Mayorov 这里没有错误,因为:
在这种情况下,文件系统驱动程序首先做什么并不重要,因为文件系统驱动程序不与磁盘控制器通信。问题是如何共享对磁盘控制器的访问。
当程序进行系统调用时,它会选择将这个调用重定向到哪个操作系统驱动程序。也就是说,通过选择系统请求的类型(对磁盘、对屏幕、对 USB 端口),程序从而选择将被调用的最终控制器驱动程序。当然,在控制器驱动程序执行之前,会执行很多操作系统本身的千字节代码,包括(在访问磁盘的情况下)文件访问权限的控制,对另一个程序正在使用的文件的控制,也许是归档卷的磁盘压缩/解压缩代码,也许是远程磁盘的网络子系统代码,以及一大堆其他奇迹,包括虚拟机代码(如果程序位于虚拟机上)。但问题不在于所有这些奇迹,而在于 一般来说,从硬件的角度来看,如何在操作系统中组织从许多程序到系统中单个副本中存在的硬件资源的访问。现代处理器中存在什么样的硬件操作系统支持。
UPD7:
在这里,他们被要求指出关于正在讨论的问题的文献。我想起了一个名字:
旧书,1990 年版。是的,处理器很旧。但它只是说明如何在 80286 中组织对普通操作系统的硬件支持,而不是 MSDOS,如您所知,MSDOS 在英特尔处理器的实模式下工作。我有这本书的纸质版。当然,80286 与英特尔后来在 80386 及更高版本中所做的有点不同,但至少有所不同。是的,这本书写得不好。或者也许是翻译。但是,正如他们所说,鱼与癌症有关。同样重要的是要了解 x86 架构并不理想,还有其他方法。
UPD8:
综上所述,我们可以说设计用于多任务和多用户磁盘操作系统的处理器必须有一些外围设备来支持这种工作,特别是必须有一个 MMU。此外,此类处理器应具有不同的硬件指令执行优先级,并且应禁止某些指令以启动用户任务的优先级执行。也就是说,此类处理器必须具有所谓的操作系统硬件支持。以此类推,例如,信号处理器必须具有对浮点运算的硬件支持。
UPD9:
在“80286 微处理器架构”一书中,您应该看第 5 章。它描述了 80286 处理器具有哪些硬件来支持操作系统。