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

Operating system 操作系统如何执行已编译的二进制文件?,operating-system,executable,binaryfiles,Operating System,Executable,Binaryfiles,当我研究进程调度时,我想到了这些问题 操作系统如何执行和控制二进制文件和编译文件的执行?我想也许操作系统会将二进制文件的一部分复制到某个内存位置,跳到那里,在执行该块后返回,然后执行下一个块。但这样它就无法控制它(例如,程序可以在任何地方跳转,并且不会返回) 在JVM的情况下,它是完全有意义的,VM解释每个指令。但在二进制文件的情况下,指令是真正的CPU可执行指令,因此我认为操作系统的行为不像VM。它确实做到了这一点。操作系统,按照某种顺序 在流程表中创建一个条目 为进程创建虚拟内存空间 将程

当我研究进程调度时,我想到了这些问题

操作系统如何执行和控制二进制文件和编译文件的执行?我想也许操作系统会将二进制文件的一部分复制到某个内存位置,跳到那里,在执行该块后返回,然后执行下一个块。但这样它就无法控制它(例如,程序可以在任何地方跳转,并且不会返回)


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

它确实做到了这一点。操作系统,按照某种顺序

  • 在流程表中创建一个条目
  • 为进程创建虚拟内存空间
  • 将程序代码加载到进程内存中
  • 将进程指令指针指向进程入口点
  • 在调度程序中创建一个条目,并设置进程线程以供执行
被拆分为块的程序不处理并发性。任务之间的切换是通过中断完成的:在给进程分配CPU之前,设置一个计时器。当计时器完成时,CPU注册一个中断,将指令指针推送到堆栈,并跳转到操作系统定义的中断处理程序。这个处理程序将CPU状态存储在内存中,交换一个虚拟内存表,并恢复一些准备好执行的其他线程。如果线程由于某些其他原因(等待用户/磁盘/网络…)而必须暂停或退出,则会发生相同的交换。

请注意,依赖产生CPU的进程是可能的,但不可靠(进程可能不会产生,从而阻止其他进程运行)

安全性是通过将CPU切换到保护模式来处理的,在这种模式下,应用程序代码无法运行某些指令(因此随机跳转通常是无害的)。看


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

您知道CPU是如何执行CPU指令的吗?是的,我设计了一个超简单的CPU(一个通用注册表,用于存储指令和PC的注册表,可能还有5条指令)去年,使用Verilog在大学里做了一个更复杂的RISC设计。一个问题,如果源代码包含两个线程,OS是如何启动编译的二进制的?它会把每个线程的代码块视为一个单独的二进制文件吗?然后共享内存将如何实现?