第1章 計算機系統漫遊(深刻理解計算機系統)

1 #include <stdio.h>
2 
3 int main() 
4 {
5     printf("hello, world\n");
6 }

1.1 信息就是位+上下文

hello程序的聲明週期是從一個源程序開始的,即程序員利用編輯器建立並保存的文本文件,文件名是hello.c。源程序實際上就是一個由值0和1組成的位(bit)序列,每8個位被組成成一組,稱爲字節。每一個字節表示程序中的某個文本字符。程序員

大部分的如今系統都使用ASCII標準來表示文本字符,這種方式就是用一個惟一的單字節大小的整數值來表示每一個字符。hello.c以字節序列的方式存儲在文件中,每一個字節都有一個整數值,而該整數值對應於某個字符。例如,整數值35對應於字符‘#’,105對應與字符‘i’。像hello.c這樣只由ASCII字符構成的文件稱爲文本文件,全部其餘文件都稱爲二進制文件。shell

hello.c的表示方法說明一個:系統中全部的信息,包括磁盤文件、存儲器中的程序。存儲器中存放的用戶數據以及網絡上傳送的數據,都是由一串位表示的。區分不一樣數據對象惟一的方法是咱們讀到這些數據對象時的上下文。網絡

 

1.2 程序被其餘程序翻譯成不一樣的格式

hello程序的聲明週期是從一個高級C語言程序開始的,爲了在系統上運行,必須被其餘程序轉化爲一系列的低級機器語言指令,而後按照一種稱爲可執行目標程序的格式打包好,並以二進制磁盤文件的形式存放起來。編輯器

在Unix系統上,從源文件到目標文件的轉發時由編譯器驅動程序完成的:函數

unix> gcc -o hello hello.c

GCC編譯器驅動程序讀取源文件hello.c,並把它翻譯成一個可執行目標文件hello。這個翻譯的過程分爲四個階段完成,如圖1-3所示。執行這四個階段的程序(預處理器、編譯器、彙編器、連接器)一塊兒構成了編譯系統(compilation system)。編碼

圖1-3 編譯系統spa

  • 預處理階段。預處理器(cpp)根據以字符#開頭的命令,修改原始的C程序。好比hello.c中第1行#include <stdio.h>命令告訴預處理器讀取系統頭文件stdio.h的內容,並把它直接插入到程序文本中,結果就獲得了另外一個C程序,一般是以.i做爲文件擴展名。
  • 編譯階段。彙編器(ccl)將文本文件hello.i翻譯成文本文件hello.s,它包含一個彙編語言程序。彙編語言程序中的每一條語句都以一種標準的文本格式確切地描述了一條低級機器語言指令。
  • 彙編階段。彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種叫作可重定位目標文件(relocatable object program)的格式,並將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它的字節編碼是機器語言指令而不是字符。若是在文本編輯器中打開將看到一堆亂碼。
  • 連接階段。hello程序調用了printf函數,它是每一個C編譯器都會提供的標準C庫中的一個函數。printf函數存在於一個名爲printf.o的單獨的預編譯好了的目標文件中。而這個文件必須以某種方式合併到咱們的hello.o程序中。連接器(ld)就負責執行處理這種合併。結果就獲得hello文件,它是一個可執行目標文件,被加載到內存中,由系統執行。

 

1.4 處理器讀並解釋存儲在存儲器中的指令

hello.c源程序已經被編譯系統翻譯成了可執行目標文件hello,並存放在磁盤上。要想在Unix系統上運行該可執行文件,須要將它輸入到稱爲外殼(shell)的應用程序中:操作系統

unix> ./hello
hello, world
unix>

外殼是一個命令行解釋器,它輸出一個提示符,等待你輸入一個命令行,而後執行這個命令。若是該命令行的第一個單詞不是一個內置的外殼命令,那麼外殼就會假設這是一個可執行文件的名字,它將加載並運行這個文件。命令行

1.4.1 系統的硬件組成翻譯

如圖1-4所示,這張圖是Intel Pentium系統產品系列的模型。

 

    1.總線

     貫穿整個系統的是一組電子管道,叫作總線,它攜帶信息字節並負責在各個部件間傳遞。一般總線被設計成傳送定長的字節塊,也就是字(word)。字中的字節數(即字長)是一個基本的系統參數,在各個系統中的狀況都不盡相同。如今的大多數機器字長有的是4個字節(32位),有的是8個字節(64位)。

    2.I/O設備

     輸入/輸出(I/O)設備是系統與外部世界的聯繫通道。示例系統包括4個I/O設備:座位用戶輸入的鍵盤和鼠標,做爲用戶輸出的顯示器,以及用於長期存儲數據和程序的磁盤驅動器。每一個I/O設備都經過一個控制器或適配器與I/O總線相連。控制器和適配器之間的區別主要在於他們的封裝方式。控制器是置於I/O設備自己或者系統的主印製電路板(主板)上的芯片組,而適配器則是一塊插在主板插槽上的卡。

    3.主存

    主存是一個臨時存儲設備, 在處理器執行程序時,用來存放程序和程序處理的數據。

    4.處理器

    中央處理單元(CPU),簡稱處理器,是解釋(或執行)存儲在主存中指令的引擎。處理器的核心是一個字長的存儲設備(或寄存器),稱爲程序計數器(PC)。在任什麼時候刻,PC都指向主存中某條機器語言指令。 

1.7 操做系統管理硬件

 當外殼加載和運行hello程序,以及hello程序輸出本身的消息時,外殼和hello程序都沒有直接訪問鍵盤、顯示器、磁盤或者主存。取而代之的是,它們依靠操做系統提供的服務。咱們把操做系統當作是應用和硬件之間插入的一層軟件,如圖1-10所示。全部應用程序對硬件的操做嘗試都必須經過操做系統。

操做系統有兩個基本的功能:1)防止硬件被失控的應用程序濫用。2)嚮應用程序提供簡單一致的機制來控制複雜而又一般截然不同的低級硬件設備。操做系統經過幾個基本的抽象概念(進程、虛擬存儲器和文件)來實現這兩個功能。如圖1-11所示,文件是對I/O設備的抽象表示,虛擬存儲器是對儲存和磁盤I/O設備的抽象表示,進程則是對處理器、主存和I/O設備的抽象表示。

虛擬機,提供對整個計算機(包括操做系統、處理器和程序)的抽象。

相關文章
相關標籤/搜索