OS如何执行编译的二进制文件?

时间:2012-10-17 09:53:02

标签: operating-system executable binaryfiles

当我研究流程安排时,这个问题浮现在我脑海中。

操作系统如何执行和控制二进制文件和已编译文件的执行?我想OS可能会将二进制文件的一部分复制到某个内存位置,跳转到那里,在执行该块后返回并执行下一个块。但是它对它没有任何控制(例如程序可以在任何地方跳转而不会回来)。

在JVM的情况下,它很有意义,VM正在解释每条指令。但在二进制文件的情况下,指令是真正的CPU可执行指令,因此我认为操作系统不像VM那样。

1 个答案:

答案 0 :(得分:4)

确实如此。操作系统按某种顺序

  • 在流程表中创建一个条目
  • 为流程创建虚拟内存空间
  • 将程序代码加载到进程内存
  • 将进程指令指针指向进程入口点
  • 在调度程序中创建一个条目,并将进程线程设置为可执行。

并发程序不会被分成块的程序处理。通过中断在任务之间切换:在给CPU进程之前,设置定时器。当定时器完成时,CPU注册一个中断,将指令指针推送到堆栈并跳转到操作系统定义的中断处理程序。此处理程序将CPU状态存储在内存中,交换虚拟内存表并还原一些准备执行的其他线程。如果线程因某些其他原因(等待用户/磁盘/网络...)或产量而必须暂停,则会发生相同的交换 http://en.wikipedia.org/wiki/Multitasking#Preemptive_multitasking.2Ftime-sharing

请注意,依赖于产生CPU的过程是可能的但不可靠(过程可能不会产生,阻止其他进程运行)
http://en.wikipedia.org/wiki/Multitasking#Cooperative_multitasking.2Ftime-sharing

通过将CPU切换到受保护模式来处理安全性,其中应用程序代码无法运行某些指令(因此随机跳转几乎无害)。见the link provided by @SkPhilipp

请注意,现代JVM不会解释每条指令(这会很慢)。相反,它编译成本机代码并首先运行代码或(在即时编译的情况下)解释,但编译“热点”(经常运行的代码)。