天天看點

《作業系統真象還原》——0.5 應用程式是什麼,和作業系統是如何配合到一起的

本節書摘來自異步社群《作業系統真象還原》一書中的第0章,第0.5節,作者:鄭鋼著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

應用程式是軟體(似乎是廢話,别急,往後看),作業系統也是軟體。cpu會将它們一視同仁,甚至,cpu不知道自己在執行的程式是作業系統,還是一般應用軟體,cpu隻知道去cs:ip寄存器中指向的記憶體取指令并執行,它不知道什麼是作業系統,也無需知道。

作業系統是人想出來的,為了讓自己管理計算機友善而創造出來的一套管理辦法。

應用程式要用某種語言編寫,而語言又是編譯器來提供的。其實根本就沒有什麼語言,有的隻是編譯器。是編譯器決定怎樣解釋某種關鍵字及某種文法。語言隻是編譯器和大家的約定,隻要寫入這樣的代碼,編譯器便将其翻譯成某種機器指令,翻譯成什麼樣取決于編譯器的行為,和語言無關,比如說c語言的printf函數,它的功能不是說一定要把字元列印到螢幕上,這要看編譯器對這種關鍵字的處理。

編譯器提供了一套庫函數,庫函數中又有封裝的系統調用,這樣的代碼集合稱之為運作庫。c語言的運作庫稱為c運作庫,就是所謂的crt(c runtime library)。

應用程式加上作業系統提供功能才算是完整的程式。由于有了作業系統的支援,一些現成的東西已經擺在那了,但這些是屬于作業系統的,不是應用程式的,是以咱們平時所寫的應用程式隻是半成品,需要調用作業系統提供好的函數才能完整地做成一件事,而這個函數便是系統調用。

使用者态與核心态是對cpu來講的,是指cpu運作在使用者态(特權3級)還是核心态(特權0級),很多人誤以為是對使用者程序來講的。

使用者程序陷入核心态是指:由于内部或外部中斷發生,目前程序被暫時終止執行,其上下文被核心的中斷程式儲存起來後,開始執行一段核心的代碼。是核心的代碼,不是使用者程式在核心的代碼,使用者代碼怎麼可能在核心中存在,是以“使用者态與核心态”是對cpu來說的。

當應用程式陷入核心後,它自己已經下cpu了,以後發生的事,應用程式完全不知道,它的上下文環境已經被儲存到自己的0特權級棧中了,那時在cpu上運作的程式已經是核心程式了。是以要清楚,核心代碼并不是成了應用程式的核心化身,作業系統是獨立的部分,使用者程序永遠不會因為進入核心态而變身為作業系統了。

應用程式是通過系統調用來和作業系統配合完成某項功能的,有人可能會問:我寫應用程式時從來沒寫什麼系統調用的代碼啊。這是因為你用到的标準庫幫你完成了這些事,庫中提供的函數其實都已經封裝好了系統調用,你需要跟下代碼才會看到。其實也可以跨過标準庫直接執行系統調用,對于linux系統來說,直接嵌入彙編代碼“int 0x80”便可以直接執行系統調用,當然要提前設定好系統調用子功能号,該子功能号用寄存器eax存儲。

會不會有人又問,編譯器怎麼知道系統調用接口是什麼,哈哈,您想啊,下載下傳編譯器時,是不是要選擇系統版本,編譯器在設計時也要知道自己将來運作在哪個系統平台上,是以這都是和系統綁定好的,各個作業系統都有自己的系統調用号,編譯器廠商在代碼中已經把宿主系統的系統調用号寫死了,沒什麼神奇的。

繼續閱讀