2016-02-03 111 views
-2

我所構成一個同學詢問以來的OS是一種擴展的或虛擬機的問題,該編譯器需要知道寄存器或處理器的指令的數目時,它產生的彙編代碼C程序。操作系統:編譯器混淆

我已經花了,而在網上淘,這裏是我的想法......

它並不需要知道寄存器的數量,因爲作爲一個虛擬機有無限的資源在每個內存發言權。

但是,它需要知道處理器知道它能夠在特定時間執行特定功能時的指示。

我想知道如果有人能澄清這對我來說,因爲我不是在我的答案非常有信心。

+2

「因爲操作系統是擴展或虛擬機」 - 嗯?這聽起來不對。你什麼意思? – Olaf

+0

@Olaf:這聽起來確實很具體。看到我的回答 –

+0

@BasileStarynkevitch:嗯......也許吧。但我強烈懷疑導致這個問題的相當多的錯誤觀念。要真正理解其含義,這些錯誤觀念必須首先得到解決。 – Olaf

回答

5

在實踐中,編譯器編譯(進入object code,經常通過一些彙編文件)不僅對於目標processor(特別instruction set架構 - ISA),但對於一個目標application binary interface - ABI,其中定義了一些約定關於register的用法(以及如何製作system calls)& calling conventions

操作系統(由kernel提供)是 - 或給予應用程序和進程 - 虛擬機非常接近到所述處理器; VM是(用戶模式,無特權的)機器指令+指令(SYSENTER)切換到內核或supervisor mode進行系統調用。請參閱this & that。關於compilers,請閱讀register allocationinstruction schedulingoptimizing compilers

如果您在計算機上有GCC,嘗試編譯一個hello-world程序(也許在一個新的目錄)與gcc -fverbose-asm -O -S hello.c然後尋找到生成的彙編代碼hello.s;添加-fdump-tree-gimple並查看其他編譯器轉儲文件[和](甚至更多與-fdump-tree-all

PS。一些編譯器編譯到內存中的機器代碼(例如SBCL)。另請閱讀關於JIT compilers。其他編譯器compileC code

1

編譯有幾個階段,從不同的抽象目標機器,這依賴於編譯器架構。

在某些階段,寄存器都不是很有限的,但在某些階段後,一個映射完成。你可以閱讀約register allocation瞭解更多詳情。我也可以建議你看看編譯器體系結構的Appel's book