可执行文件是机器代码 - 为硬件制作吗?

时间:2011-04-08 16:54:17

标签: linux executable

这是来自Wiki。

“在计算中,可执行文件使计算机”根据编码指令执行指示的任务,“(机器代码??)

“现代操作系统保持对计算机资源的控制,要求各个程序进行系统调用以访问特权资源。由于每个操作系统系列都有自己的系统调用体系结构,因此可执行文件通常与特定操作系统相关联。” / p>

这是我的观点。 可执行文件不能是机器代码,因为它们需要通过操作系统进行硬件服务(系统调用)因此可执行文件还不是“机器代码”......也许它就像代码的某些部分是实际的机器代码而某些部分是只是想调用嵌入在操作系统中的机器代码?总的来说,它包含一些机器代码 - 以及一些调用操作系统的代码。

在Damon的回答后编辑: 最后,OS是一组机器代码。基本上OS将执行复制粘贴用户的机器代码(由C编译器创建)的工作,然后如果指令是系统调用,则传输进入OS存储器区域以进行处理。现在的问题是用C生成的机器代码可以做到这一点吗?就像要求将控制转移到操作系统等 - 我想它的系统调用更高的抽象但是在引擎盖下 - 它是如何工作的。

我感觉它与鸡蛋问题类似,C创建操作系统,C使用操作系统无法找到该过程的确切方式。 谁能为我打破这个难题?

1 个答案:

答案 0 :(得分:2)

有一点不排除另一件事。可执行文件(除非它们是在虚拟机中运行的某种形式的字节码)机器代码。但是,有不同类型的指令,其中一些指令在某些特权级别不可用。

这就是操作系统的用武之地,它是以最高权限级别运行的“机器代码”,作为“重要”部分和任务的仲裁者,例如决定谁获得CPU时间以及进入哪个值一些硬件注册。

(最初评论,根据要求作出答复)

编辑:关于您的扩展问题,这大致如下。打开计算机时,处理器以最高权限级别运行。在这种“模式”下,BIOS,引导加载程序和操作系统可以完成他们想要的任务。这听起来不错,但你不希望任何类型的代码能够做任何想做的事情。

例如,代码可以告诉MMU允许读取或写入哪些内存页面,以及哪些内存页面不允许读取或写入。或者,它可以定义在发生诸如陷阱或中断之类的“特殊事物”时调用的地址。或者,它可以直接写入一些特殊的内存地址,映射某些设备的端口(磁盘,网络等)。

最终,操作系统切换到“非特权”模式并调用一些非操作系统代码。发生陷阱或中断时,执行会中断并在其他地方继续执行(由之前的操作系统指定),并再次启用权限级别。处理完中断后,将取消权限,再次调用用户代码 如果用户程序需要操作系统执行“类似OS”的操作,它会根据约定的方案(例如在某些特定的寄存器中)设置参数并执行陷阱指令。

例如,这是多线程或虚拟内存的实现方式。在定期间隔内,计时器会触发中断,从而停止执行“普通”代码,并调用内核中的某些代码(处于特权模式)。然后,该代码在某种优先级方案之后决定应该返回哪个用户进程控制。这些是分发的“CPU时间片”。 如果某个进程从不允许的页面读取或写入,则MMU会生成陷阱。操作系统然后查看发生的情况和位置,并决定是否将某些数据从磁盘加载到某个内存区域(并可能清除其他内容)并更改进程的映射,或者是否使用“分段错误”错误来终止进程

当然,实际上它的复杂程度要高出一百万倍,但原则上就是它的工作原理。

操作系统或程序最初是用C编写还是用汇编程序编写并不重要。对于处理器来说,它只是一系列机器指令。即使是python或perl脚本最后也只是“机器指令”,只能通过解释器绕道而行。