2012-10-17 39 views
6

當我在學習進程調度時,這個問題出現在我的腦海。操作系統如何執行編譯後的二進制文件?

操作系統如何執行和控制二進制和編譯文件的執行?我想操作系統可能會將二進制文件的一部分複製到某個內存位置,跳到那裏,在執行該塊並執行下一個之後回來。但是它不會對它有任何控制(例如,程序可以在任何地方跳轉,不會返回)。

在JVM的情況下,它非常有意義,VM正在解釋每條指令。但在二進制文件的情況下,這些指令是真正的CPU可執行指令,所以我不認爲操作系統就像VM一樣。

+0

您是否知道CPU如何執行CPU指令? – sll

+0

是的,我去年設計了一個超級簡單的CPU(一個通用註冊表,用於存儲指令和PC的註冊表,可能有5條指令),現在使用Verilog在大學裏做了一點更復雜的RISC設計。 – Gediminas

回答

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不解釋每條指令(這會很慢)。相反,它編譯成本地代碼並運行代碼或(在即時編譯的情況下)首先解釋,但編譯「熱點」(足夠頻繁運行的代碼)。

相關問題