操作系统如何执行编译后的二进制文件?

9
当我学习进程调度时,这个问题浮现在我的脑海中。
操作系统如何执行和控制二进制和编译文件的执行?我认为,操作系统可能会将二进制文件的一部分复制到某个内存位置,跳转到那里,在执行完该块后返回并执行下一个块。但是,它无法对其进行任何控制(例如,程序可以跳转到任何地方并且不返回)。
在JVM的情况下,这很有道理,VM正在解释每个指令。但对于二进制文件情况,指令是真正的CPU可执行指令,因此我认为操作系统不像VM。

你知道CPU如何执行CPU指令吗? - sll
是的,去年我设计了一个超级简单的CPU(一个通用寄存器,一个存储指令和PC的寄存器,可能还有5个指令),现在在大学里使用Verilog进行更复杂的RISC设计。 - Gediminas
1个回答

8
它确切地做到了这一点。操作系统按某种顺序:
  • 在进程表中创建一个条目
  • 为进程创建虚拟内存空间
  • 将程序代码加载到进程内存中
  • 将进程指令指针指向进程入口点
  • 在调度程序中创建一个条目,并设置进程线程以准备执行。
并未将程序拆分为块来处理并发性。任务之间的切换是通过中断完成的:在给进程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切换到受保护模式处理,应用程序代码无法运行某些指令(因此随机跳转基本上是无害的)。请参见 @SkPhilipp提供的链接 请注意,现代JVM不会解释每个指令(这将很慢)。相反,它将编译为本机代码并运行代码或(在即时编译的情况下)首先解释,但编译“热点”(经常运行的代码)。

一个问题,如果源代码包含两个线程,操作系统如何启动执行编译后的二进制文件?它会将每个线程的代码块视为单独的二进制文件吗?那么共享内存该如何实现? - mercury0114

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接