2022年9月22日:開始時間
代碼下載:https://gitee.com/liu-jun8/cosmos.git
項目開源:GitHub - CosmosPsi/CosmosDocs
操作系統(tǒng)是所有軟件的基礎(chǔ)硬萍,所有上層軟件都要依賴于操作系統(tǒng)提供的各種機制具温,才能運行。
- 內(nèi)存管理部門啥刻、進程管理部門、I/O 管理部門巾腕、文件管理部門豫领、通信管理部門
Hello world.c程序編譯過程
#include "stdio.h"
int main(int argc, char const *argv[])
{
printf("Hello World!\n");
return 0;
}
其實纪隙,我們也可以手動控制以上這個編譯流程,從而留下中間文件方便研究:
gcc HelloWorld.c -E -o HelloWorld.i 預(yù)處理:加入頭文件碗硬,替換宏瓤湘。
gcc HelloWorld.c -S -c -o HelloWorld.s 編譯:包含預(yù)處理瓢颅,將 C 程序轉(zhuǎn)換成匯編程序。
gcc HelloWorld.c -c -o HelloWorld.o 匯編:包含預(yù)處理和編譯岭粤,將匯編程序轉(zhuǎn)換成可鏈接的二進制程序惜索。
gcc HelloWorld.c -o HelloWorld 鏈接:包含以上所有操作,將可鏈接的二進制程序和其它別的庫鏈接在一起剃浇,形成可執(zhí)行的程序文件巾兆。
程序裝載執(zhí)行
計算機必須具備五大基本組成部件:裝載數(shù)據(jù)和程序的輸入設(shè)備;記住程序和數(shù)據(jù)的存儲器虎囚;完成數(shù)據(jù)加工處理的運算器角塑;控制程序執(zhí)行的控制器;顯示處理結(jié)果的輸出設(shè)備淘讥。
我們可以通過 gcc -c -S HelloWorld 得到(只能得到其匯編代碼圃伶,而不能得到二進制數(shù)據(jù))。我們用 objdump -d HelloWorld 程序蒲列,得到 /lesson01/HelloWorld.dump窒朋,其中有很多庫代碼(只需關(guān)注 main 函數(shù)相關(guān)的代碼),如下圖:
以上圖中蝗岖,分成四列:第一列為地址侥猩;第二列為十六進制,表示真正裝入機器中的代碼數(shù)據(jù)抵赢;第三列是對應(yīng)的匯編代碼欺劳;第四列是相關(guān)代碼的注釋。這是 x86_64 體系的代碼铅鲤,由此可以看出 x86 CPU 是變長指令集划提。
現(xiàn)代電子計算機正是通過內(nèi)存中的信息(指令和數(shù)據(jù))做出相應(yīng)的操作,并通過內(nèi)存地址的變化邢享,達到程序讀取數(shù)據(jù)鹏往,控制程序流程(順序、跳轉(zhuǎn)對應(yīng)該圖靈機的讀頭來回移動)的功能驼仪。
計算機資源組成
- 總線掸犬,負責(zé)連接各種其它設(shè)備,是其它設(shè)備工作的基礎(chǔ)绪爸。
2.CPU湾碎,即中央處理器,負責(zé)執(zhí)行程序和處理數(shù)據(jù)運算奠货。 - 內(nèi)存介褥,負責(zé)儲存運行時的代碼和數(shù)據(jù)。
- 硬盤,負責(zé)長久儲存用戶文件數(shù)據(jù)柔滔。
- 網(wǎng)卡溢陪,負責(zé)計算機與計算機之間的通信。
- 顯卡睛廊,負責(zé)顯示工作形真。
- 各種 I/O 設(shè)備,如顯示器超全,打印機咆霜,鍵盤,鼠標(biāo)等嘶朱。
硬件廠商需要管理和控制這些硬件就要編寫對應(yīng)的代碼蛾坯,通常這樣的代碼我們稱之為驅(qū)動程序。
金句摘抄
“保持中立疏遏,務(wù)實求真脉课,對比之下,方見真章财异√攘悖”