1. 程式人生 > 實用技巧 >計算機系統漫遊

計算機系統漫遊

前言

  • 計算機能運作,是基於硬體和軟體來執行程式,系統會追著時間方式不斷變化,但是內在的概念基本不會改變,所以單純的學習新的工具,短期內收益增加會明顯,但是長期來看,缺乏核心競爭力(-畢竟體力和精神力無法和年輕人相比),
    這樣就會出現吃青春飯的現象,所以學習機器內在執行原理非常重要,因為這塊兒東西,需要花費大量時間去學習和研究,是達到某個高點的必經之路.所以來學習這本教材

1.1 資訊就是 位 + 上下文

程式的生命週期是從一個源程式(或者說原始檔)開始的(比如我建立了一個hello.c的檔案,並儲存),這些檔案本質上由值0 和 1 組成的位(又稱 為位元)序列,8 個位被組織成一組,稱為位元組。每個位元組表示程式中的某些文字字元,
就想下圖,一個位元組對應一個數值,比如\n 等於10,#號對應的是35,
hello.c的表示方法說明一個基本思想,系統終所有的資訊,例如你能看到的檔案,磁碟上的檔案,都是位元表示的, 區分不同物件的唯一方法是上下文,一不同的上下文表達不同的資料

  • c語言編譯成二進位制可執行流程

練習

vi hello.c

#include <stdio.h> 2
int main()
{
 printf("hello, world\n");
 :return 0;
}

[root@instance-bhrt87fn code]# gcc -o hello hello.c # 編譯hello.c檔案
[root@instance-bhrt87fn code]# ls 
hello  hello.c  # hello 是被建立的可執行的二進位制檔案
[root@instance-bhrt87fn code]# ./hello
hello,word!

1.2 系統的硬體組成

  • 瞭解硬體組織有助於我們更深入瞭解執行hello 程式時發生了什麼
  • Intel系統產品族的模型圖

匯流排

  • 貫穿整個系統的一組電子管道,它主要負責攜帶和傳遞資訊,通常匯流排被設計成傳送定長的位元組塊(字 word),4個位元組(32位),8個位元組(64位)

I/O 裝置

  • I / 0 (輸 入 / 輸 出 )設 備 是 系 統 與 外 部 世 界 的 聯 系 通 道, 示 例 系 統 包 括 四 個 I / O 設 備 :作為使用者輸入的鍵盤和滑鼠,作為使用者輸出的顯示器,以及用於長期儲存資料和程式 的磁碟驅動器(簡單地說就是磁碟)。最開始,可執行程式h e l l o 就存放在磁碟上。
    每個I/O 裝置都通過一個控制器或介面卡與I/O 匯流排相連。控制器和介面卡之間的區別主要在於它們的封裝方式。控制器是I/O 裝置本身或者系統的主印製電路板(通常稱作 主機板)上的晶片組。而介面卡則是一塊插在主機板插槽上的卡。無論如何,它們的功能都是 在 I/O 匯流排和I/O 裝置之間傳遞資訊。

主存(臨時存在變數的地方)

  • 主存是一個臨時儲存裝置,在處理器執行程式時,用來存放程式和程式處理的資料。從 物理上來說,主存是由一組動態隨機存取儲存器(DRAM)晶片組成的。從邏輯上來說,儲存 器是一個線性的位元組陣列,每個位元組都有其唯一的地址(陣列索引),這些地址是從零開始 的。一般來說,組成程式的每條機器指令都由不同數量的位元組構成。與 C 程式變數相對應的 資料項的大小是根據型別變化的。比如,在執行Linux的 x86-64機器上,short型別的資料 需 要 2 個 字 節 ,i n t 和 f l o a t 類 型 需 要 4 個 字 節 ,而 l o n g 和 d o u b l e 類 型 需 要 8 個 字 節

處理器

  • 中央處理單元(CPU), 簡稱處理器,是解釋(或執行)儲存在主存中指令的引擎。處理
    器的核心是一個大小為一個字的儲存裝置(或暫存器),稱為程式計數器(PC)。在任何時 刻 ,P C 都指向主存中的某條機器語言指令(即含有該條指令的地址)
  • 從系統通電開始,直到系統斷電,處理器一直在不斷地執行程式計數器指向的指令, 再更新程式計數器,使其指向下一條指令。處理器看上去是按照一個非常簡單的指令執行 模型來操作的,這個模型是由指令集架構決定的。在這個模型中,指令按照嚴格的順序執 行 ,而執行一條指令包含執行一系列的步驟。處理器從程式計數器指向的記憶體處讀取指 令,解釋指令中的位,執行該指令指示的簡單操作,然後更新P C ,使其指向下一條指令, 而這條指令並不一定和在記憶體中剛剛執行的指令相鄰。
  • 這樣的簡單操作並不多,它們圍繞著主存、暫存器檔案(register file)和算術/邏輯單 元(ALU)進行。暫存器檔案是一個小的儲存裝置,由一些單個字長的暫存器組成,每個 暫存器都有唯一的名字。A L U計算新的資料和地址值。下面是一些簡單操作的例子, CPU在指令的要求下可能會執行這些操作。
•加 載 :從主存複製一個位元組或者一個字到暫存器,以覆蓋暫存器原來的內容。
•存 儲 :從暫存器複製一個位元組或者一個字到主存的某個位置,以覆蓋這個位置上原
來的內容。
•操作:把兩個暫存器的內容複製到ALU, ALU對這兩個字做算術運算,並將結果
存放到一個暫存器中,以覆蓋該暫存器中原來的內容。
•跳 轉 :從指令本身中抽取一個字,並將這個字複製到程式計數器(P C )中,以覆蓋
P C 中原來的值。

1.3 執行hello 程式的生命週期

  • 使用者開始通過shell程式執行'./hello' 後,shell將字串逐一寫入暫存器,然後把它幫到記憶體中,一旦目標檔案h e llo 中的程式碼和資料被載入到主存
  • 處理器就開始執行hello程式的main程式中的機器語言指令。這些指令將“hello world'n” 字串中的位元組從主存 複製到暫存器檔案,再從暫存器檔案中複製到顯示裝置,最終顯示在螢幕上。

c語言的小知識

     •C 語言是貝爾實驗室的Dennis Ritchie於 1969年 〜 1973年間建立的。美國國家標準學
會(American National Standards Institute, ANSI)在 1989 年頒佈了 ANSI C 的標準,後來 C 語言的標準化成了國際標準化組織(International Standards Organization, ISO)的責任。這 些標準定義了 C 語言和一系列函式庫,即所謂的C 標準庫。Kernighan和 Ritchie在他們的 經典著作中描述了 ANSI C , 這本著作被人們滿懷感情地稱為“K&R” [61]o 用 Ritchie的話 來說[92], C 語 言 是 “古怪的、有缺陷的,但同時也是一個巨大的成功"。為什麼會成功呢?
     •C 語言小而簡單。C 語言的設計是由一個人而非一個協會掌控的,因此這是一個 簡潔明瞭、沒有什麼冗贅的設計。K & R 這本書用大量的例子和練習描述了完整 的 C 語言及其標準庫,而全書不過2 6 1頁。C 語言的簡單使它相對而言易於學 習,也易於移植到不同的計算機上。
     •C 語 言 是 為 實 踐 目 的 設 計 的 。 C 語 言 是 設 計 用 來 實 現 U n i x 操 作 系 統 的 。 後 來 , 其他人發現能夠用這門語言無障礙地編寫他們想要的程式。
C 語言是系統級程式設計的首選,同時它也非常適用於應用級程式的編寫。然而,它也 並非適用於所有的程式設計師和所有的情況。C 語言的指標是造成程式設計師困惑和程式錯誤的 一個常見原因。同時,C 語言還缺乏對非常有用的抽象的顯式支援,例如類、物件和異 常 。像 C + + 和 J a v a 這 樣 針 對 應 用 級 程 序 的 新 程 序 語 言 解 決 了 這 些 問 題 。
    
  • 說明:所有知識來自<<深入理解計算機系統>>( csapp ) 這本書 和自己的總結,僅供學習和交流,侵權刪除.