1.全書(shū)結(jié)構(gòu)
(1).Chapter01:計(jì)算機(jī)系統(tǒng)漫游
(2).Chapter02~Chapter12分為三部分
- Part I:程序結(jié)構(gòu)和執(zhí)行(Chapter02~Chapter06)
- Part II:在系統(tǒng)上運(yùn)行程序(Chapter07~Chapter09)
- Part III:進(jìn)程間的交互和通信(Chapter10~Chapter12)
2.程序編譯流程
(1).編譯系統(tǒng)工作流程
程序編譯
詳細(xì)過(guò)程
- Stage1(預(yù)處理) :預(yù)處理器會(huì)根據(jù)以#開(kāi)頭的代碼來(lái)修改原始程序,預(yù)處理器會(huì)讀取頭文件中的內(nèi)容,將頭文件中的內(nèi)容直接插入到源程序中,結(jié)果就得到了另一個(gè)C程序。經(jīng)預(yù)處理器處理后得到的文件通常以.i為后綴結(jié)尾,它仍然是一個(gè)文本文件;
- Stage2(編譯) :編譯器將hello.i文件翻譯成hello.s文件,這一過(guò)程稱為編譯。其中編譯這一階段包括詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成及優(yōu)化等一系列的中間操作;
- Stage3(匯編) :匯編器根據(jù)指令集將匯編程序hello.s翻譯成機(jī)器指令,并且把這一系列的機(jī)器指令按照固定的規(guī)則進(jìn)行打包得到 可重定位目標(biāo)文件hello.o 。此時(shí),雖然hello.o是一個(gè)二進(jìn)制文件,但是還不能執(zhí)行還需要進(jìn)行鏈接操作;
- Stage4(鏈接) :在hello這個(gè)程序中,調(diào)用了標(biāo)準(zhǔn)C庫(kù)中的函數(shù)printf,每一個(gè)C語(yǔ)言的編譯器都會(huì)提供。當(dāng)調(diào)用printf函數(shù)時(shí),編譯器就知道你要在屏幕上打印輸出內(nèi)容,它會(huì)將這行代碼翻譯成計(jì)算機(jī)可以理解的指令。printf函數(shù)在名為printf.o文件中,這個(gè)文件是一個(gè)提前編譯好的目標(biāo)文件。鏈接器ld負(fù)責(zé)把hello.o和printf.o進(jìn)行合并,但合并需要遵循一定的規(guī)則。正是由于鏈接器要對(duì)hello.o和printf.o進(jìn)行調(diào)整,所以hello.o才會(huì)稱為可重定位目標(biāo)文件,最終經(jīng)過(guò)鏈接階段可以得到 可執(zhí)行目標(biāo)文件hello 。此時(shí),得到的hello就可以被加載到內(nèi)存中執(zhí)行了。
(2).理解編譯系統(tǒng)工作流程意義
- 優(yōu)化程序性能;
- 理解鏈接時(shí)出現(xiàn)的錯(cuò)誤;
- 避免安全漏洞(緩沖區(qū)溢出);
3.計(jì)算機(jī)系統(tǒng)硬件組成
計(jì)算機(jī)硬件系統(tǒng)組成
(1).CPU的結(jié)構(gòu)
程序計(jì)數(shù)器PC :一個(gè)字即4字節(jié)(32位系統(tǒng))或一個(gè)字即8字節(jié)(64位系統(tǒng))的存儲(chǔ)空間,里面存放的是某一條指令的地址。從系統(tǒng)上電的那一瞬間到系統(tǒng)斷電,處理器就不斷地在執(zhí)行PC執(zhí)向的指令,然后更新PC,使其指向下一條要指向的指令。注意:下一條執(zhí)行的指令與剛剛執(zhí)行過(guò)的指令不一定是相鄰的地址。
寄存器文件 :它是CPU內(nèi)部的一個(gè)存儲(chǔ)設(shè)備,寄存器文件是由一些單字長(zhǎng)的寄存器構(gòu)成,每個(gè)寄存器都有自己唯一的名字。換句話說(shuō),寄存器可以理解為一個(gè)臨時(shí)存放數(shù)據(jù)的空間。
算術(shù)邏輯單位ALU :例如,計(jì)算兩個(gè)變量a、b的和,處理器從內(nèi)存中讀取a的值暫存在寄存器X中,讀取b的值暫存在寄存器Y中,這個(gè)操作會(huì)覆蓋寄存器中原來(lái)的數(shù)值。處理器完成加載的操作后,ALU會(huì)復(fù)制寄存器X和Y中保存的數(shù)值,然后進(jìn)行算術(shù)運(yùn)算,得到的結(jié)果會(huì)保存在寄存器X或寄存器Y中。此時(shí),寄存器中原來(lái)的值會(huì)被新的值所覆蓋。
(2).主存/內(nèi)存
處理器在執(zhí)行程序時(shí),內(nèi)存主要存放程序指令和數(shù)據(jù)。從物理上來(lái)說(shuō),內(nèi)存就是由隨機(jī)動(dòng)態(tài)存儲(chǔ)芯片組成;從邏輯上來(lái)說(shuō),內(nèi)存可以看成是一個(gè)從0開(kāi)始的大數(shù)組,每個(gè)字節(jié)都有相應(yīng)的地址。
(3).總線
內(nèi)存和處理器之間通過(guò)總線來(lái)進(jìn)行數(shù)據(jù)傳遞,總線貫穿了整個(gè)計(jì)算機(jī)系統(tǒng),它負(fù)責(zé)將信息從一個(gè)部件傳遞到另一個(gè)部件,通??偩€被設(shè)計(jì)成固定長(zhǎng)度的字節(jié)塊即字word。字表示多少個(gè)字節(jié),各個(gè)系統(tǒng)是不一樣的。
(4).輸入輸出設(shè)備
例如:鍵盤(pán)、鼠標(biāo)、顯示器等,每個(gè)輸入輸出設(shè)備都通過(guò)一個(gè)控制器或者適配器與IO總線相連。
4.程序運(yùn)行背后的故事
(1).鍵盤(pán)輸入./hello時(shí),shell程序會(huì)將輸入的字符逐一讀入寄存器,處理器會(huì)把這個(gè)hello字符串放入內(nèi)存中;
第1步
(2).當(dāng)完成輸入,按下回車鍵時(shí)shell程序已經(jīng)知道我們已經(jīng)完成了命令的輸入,然后執(zhí)行一系列的指令來(lái)加載可執(zhí)行文件hello。這些指令將hello中的數(shù)據(jù)和代碼從磁盤(pán)復(fù)制到內(nèi)存。數(shù)據(jù)就是要在屏幕上顯示的“hello worldn”,這個(gè)復(fù)制的過(guò)程將利用DMA技術(shù),數(shù)據(jù)可以不經(jīng)過(guò)處理器,從磁盤(pán)直接到達(dá)內(nèi)存;
第2步
(3).當(dāng)可執(zhí)行文件hello中的代碼和數(shù)據(jù)被加載到內(nèi)存中,處理器就開(kāi)始執(zhí)行main函數(shù)中的代碼。CPU會(huì)將“hello worldn”這個(gè)字符串從內(nèi)存復(fù)制到寄存器文件,再?gòu)募拇嫫魑募?fù)制到顯示設(shè)備即屏幕上;
第3步
5.內(nèi)存層級(jí)結(jié)構(gòu)
(1).通常情況下,大容量的存儲(chǔ)設(shè)備存取速度要比小容量的慢;運(yùn)行更快設(shè)備的價(jià)格相對(duì)于運(yùn)行速度慢的設(shè)備的價(jià)格要貴;
寄存器文件Register File 100~1000B
L1 cache 10~100KB
L2 cache 0.1 ~10MB
L3 cache 10~100MB
內(nèi)存Main Memory 1~100GB
磁盤(pán)Disk 1~1000TB
(2).針對(duì)處理器和內(nèi)存之間的讀寫(xiě)速度差異,系統(tǒng)設(shè)計(jì)人員在寄存器文件和內(nèi)存之間引入了高速緩存cache 。比較新且處理能力比較強(qiáng)的處理器,一般有三級(jí)高速緩存:L1 cache、L2 cache、L3 cache。L1 cache的訪問(wèn)速度與訪問(wèn)寄存器文件幾乎一樣快,L2 cache的訪問(wèn)速度是L1的5倍,L3 cache的容量更大,訪問(wèn)速度與L2 cache相比更慢。
內(nèi)存層次結(jié)構(gòu)
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7550瀏覽量
88750 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7616瀏覽量
137887 -
計(jì)算機(jī)系統(tǒng)
+關(guān)注
關(guān)注
0文章
289瀏覽量
24228 -
編譯器
+關(guān)注
關(guān)注
1文章
1642瀏覽量
49318 -
程序編譯
+關(guān)注
關(guān)注
0文章
9瀏覽量
5489
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論