大家好,又見面了,我是你們的朋友全棧君。
系統調用和進階程式設計語言的移植性
作業系統的硬體控制功能,通常是通過一些小的函數集合體的形式來提供的。這些函數及調用函數的行為統稱為系統調用(system call),也就是應用對作業系統(system)的功能進行調用(call)的意思。在前面的程式中用到了time()及printf()等函數,這些函數内部也都使用了系統調用。這裡之是以用“内部”這個詞,是因為在Windows作業系統中,提供傳回目前日期和時刻,以及在顯示器中顯示字元串等功能的系統調用的函數名,并不是time()和printf()。系統調用是在time()和printf()函數的内部執行的。大家可能會認為這個方法有些繞,不過這是有原因的。
C語言等進階程式設計語言并不依存于特定的作業系統。這是因為人們希望不管是Windows還是Linux,都能使用幾乎相同的源代碼。是以,進階程式設計語言的機制就是,使用獨自的函數名,然後再在編譯時将其轉換成相應作業系統的系統調用(也有可能是多個系統調用的組合)。也就是說,用進階程式設計語言編寫的應用在編譯後,就轉換成了利用系統調用的本地代碼(圖9-6)。

圖9-6 進階程式設計語言的函數調用在編譯後變成了系統調用
在進階程式設計語言中,也存在可以直接調用系統調用的程式設計語言。不過,利用這種方式做成的應用,移植性①并不友好(也俗稱為有惡意行為的應用)。例如,直接調用Windows系統調用的應用,在Linux上顯然是無法運作的。
Ps:①移植性指的是同樣的程式在不同作業系統下運作時需要花費的時間等,費時越少說明移植性越好。
Win編譯和連結機制
應用和硬體無關?
在用C語言等進階程式設計語言開發的Windows應用中,大家很少能接觸到直接控制硬體的指令。這是因為硬體的控制是由Windows全權負責的。
不過,Windows提供了通過應用來間接控制硬體的方法。利用作業系統提供的系統調用功能就可以實作對硬體的控制。在Windows中,系統調用稱為API(圖11-1)。各API就是應用調用的函數。這些函數的實體被存儲在DLL檔案中。
圖11-1 應用通過作業系統間接控制硬體
下面讓我們來看一個利用系統調用來間接控制硬體的示例。例如,假設要在視窗中顯示字元串,就可以使用Windows API中的TextOut函數①。TextOut的文法如代碼清單11-1所示。在這段代碼中,确實沒有能讓大家意識到硬體的參數。帶有“裝置描述表的句柄”這一注釋的參數hdc,是用來指定字元串及圖形等繪制對象的識别值,表示的也不是直接硬體裝置。
代碼清單11-1 TextOut函數的文法(C語言)
BOOL TextOut(
HDC hdc, //裝置描述表的句柄
int nXStart, //顯示字元串的x坐标
int nYStart, //顯示字元串的y坐标
LPCTSTR lpString, //指向字元串的指針
int cbString //字元串的文字數
);
複制
那麼,在處理TextOut函數的内容時,Windows做了什麼呢?從結果來看,Windows直接控制了作為硬體的顯示器。但Windows本身也是軟體,由此可見,Windows應該向CPU傳遞了某些指令,進而通過軟體控制了硬體。
Ps:注腳
① 在向視窗和列印機輸出字元串時,可以使用Windows提供的TextOut函數作為API。C語言提供的printf函數,是用來在指令提示符中顯示字元串的函數。使用printf函數,是無法向視窗和列印機輸出字元串的。
釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/154108.html原文連結:https://javaforall.cn