1. printf("Hello world!");屏幕上顯示字元了屏幕怎麼顯示的
再談數據。首先是關於printf函數在何處的信息。在動態鏈接中,這些信息就是printf這個名字還有動態鏈接庫的名字。在靜態鏈接中,printf處於一個絕對或相對的地址,也就是一個或多個整數中。再有一部分數據就是"Hello world!"字元串。這條字元串以某種編碼存在程序中。 那麼顯示的過程是怎樣的呢。當然是靠操作系統。操作系統顯示出字元串需要顯示設備,那麼工程師就需要為操作系統編寫程序控制這些顯示設備,習慣上我們稱這些控製程序為驅動程序。首先,顯示設備需要按照CPU設計來與設備交互的方式接入到CPU所在的計算機系統,驅動程序按照顯示設備的工作方式編寫,控制CPU和顯示設備,以便操作系統實現顯示功能。 那麼現在這個實現鏈條愈發清晰了:編譯器將語句printf("Hello world!");分解成指令和數據,這些指令使得字元串"Hello world!"被丟給C函數庫處理,C函數庫的指令使得這條字元串被送給操作系統的編程介面,在操作系統中,先按照字體文件將字元串數據轉化成圖像方陣。顯示驅動程序通過計算機匯流排將圖像方陣信息寫入到幀緩沖區,這些信息被反映到顯示設備的輸出中,你就從屏幕上看到列印出的字元串了。 CPU真正的做法只是載入數據到內存地址空間,或者執行內存中的指令。載入哪些數據到內存地址空間是由內存地址空間上更早的指令決定的。那麼最早的這些指令是怎麼來的呢,答案是在CPU通電之前這些指令已經被編入到內存地址空間了。那麼這些預先載入的指令會指揮CPU開始執行位於BIOS中的程序,這些程序會在連接到計算機上的設備都准備就緒後按照BIOS的配置查找啟動設備。以PC舉例,它按順序讀取各個啟動設備的數據,確認設備是否可用於啟動。當它讀到操作系統所在的存儲設備時,它將操作系統的啟動程序讀入到內存中並執行它們。 操作系統程序是怎麼編譯鏈接的呢?答案是由更早的操作系統上的程序編譯鏈接。那麼最早的操作系統怎麼編譯鏈接呢?答案是由沒有操作系統的計算機上的程序編譯鏈接。是的,操作系統不是必須的。最簡陋的操作系統只是對硬體功能的簡單封裝,這些封裝不是必須的。那麼最早的程序是怎麼輸入到計算機上的呢?答案是通過復雜的接線來體現計算邏輯。在計算機剛小型化的那幾年,流行的是用紙帶打孔、或者按動開關。