摘要:系統調用和高級編程語言的移植性操作系統的硬件控制功能,通常是通過一些小的函數集合體的形式來提供的。這是因為硬件的控制是由全權負責的。語言提供的函數,是用來在命令提示符中顯示字符串的函數。
操作系統的硬件控制功能,通常是通過一些小的函數集合體的形式來提供的。這些函數及調用函數的行為統稱為系統調用(system call),也就是應用對操作系統(system)的功能進行調用(call)的意思。在前面的程序中用到了time()及printf()等函數,這些函數內部也都使用了系統調用。這里之所以用“內部”這個詞,是因為在Windows操作系統中,提供返回當前日期和時刻,以及在顯示器中顯示字符串等功能的系統調用的函數名,并不是time()和printf()。系統調用是在time()和printf()函數的內部執行的。大家可能會認為這個方法有些繞,不過這是有原因的。
C語言等高級編程語言并不依存于特定的操作系統。這是因為人們希望不管是Windows還是Linux,都能使用幾乎相同的源代碼。因此,高級編程語言的機制就是,使用獨自的函數名,然后再在編譯時將其轉換成相應操作系統的系統調用(也有可能是多個系統調用的組合)。也就是說,用高級編程語言編寫的應用在編譯后,就轉換成了利用系統調用的本地代碼(圖9-6)。
圖9-6 高級編程語言的函數調用在編譯后變成了系統調用
在高級編程語言中,也存在可以直接調用系統調用的編程語言。不過,利用這種方式做成的應用,移植性①并不友好(也俗稱為有惡意行為的應用)。例如,直接調用Windows系統調用的應用,在Linux上顯然是無法運行的。
Ps:①移植性指的是同樣的程序在不同操作系統下運行時需要花費的時間等,費時越少說明移植性越好。
?
?
在用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函數,是無法向窗口和打印機輸出字符串的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/118878.html
閱讀 3707·2023-04-26 00:56
閱讀 2685·2021-09-30 10:01
閱讀 960·2021-09-22 15:30
閱讀 3914·2021-09-07 10:21
閱讀 1506·2021-09-02 15:40
閱讀 2749·2021-08-30 09:47
閱讀 1233·2021-08-16 10:57
閱讀 1862·2019-08-30 14:01