notes

深入理解計算機系統

Capture One: A Tour of Computer Systems

理解hello.c的執行過程:

編譯過程

C語言hello world程序的編譯過程:
這裏寫圖片描述
命令:Unix>gcc -o hello hello.c 生成hello可執行文件
分爲四個階段 預處理 -》 編譯 -》裝配 -》鏈接

  • 預處理:由預處理器(cpp)完成,處理源文件中的#開頭的指令,修改C源程序,結果爲以.i爲後綴的C源程序;
  • 編譯:編譯器(cc1) 將文本文件hello.i 翻譯(translate)成hello.s,其中包含了彙編語言程序(assembly-language program)。其中的每一條語句代表了一個低級的機器語言指令。
  • 裝配:裝配器(as)將hello.s翻譯成機器語言指令,打包成可定位目標程序(relacatable object program)並將其存儲在hello.o文件中,這是一個二進制文件,而不是文本文件。
  • 鏈接:printf函數保存在由C編譯器提供的printf.o文件中,鏈接器(ld)將它與我們的hello.o文件鏈接起來,結果是hello可執行文件。
  • 執行過程

    執行命令unix> ./hello
    計算機系統的硬件結構:
    這裏寫圖片描述

  • Bus:總線,在計算機的各個部分之間傳遞數據,通常以字(word)爲單位傳遞信息。
  • I/O Devices:輸入輸出設備,每一個IO設備通過控制器或者適配器連接到Bus上。控制器通常是設備上或主板上的一組芯片,適配器通常是插在主板接口上的設備(卡,card)。它們的目標都是在設備和Bus之間傳遞信息。
  • Main Memory:主存,在程序執行是存儲程序和數據,通常由DRAM組成.主存被組織成字節的線性數組,每一個字節都有自己唯一的地址,從0開始。
  • Processer:處理器,執行程序的引擎,其中的程序計數器始終指向主存中的一個機器指令。
  • 1,讀取`hello`命令

    這裏寫圖片描述

    2,將可執行文件拷貝到主存中

    這裏寫圖片描述

    3,將`hello, world`字符串輸出到屏幕上

    這裏寫圖片描述

    計算機系統的cache和分層存儲結構:

    緩存的原理:局部性(locality)
    分層結構中,寄存器爲最上層,L0層,三級緩存分別爲L1, L2, L3層。主存爲L4層,等等。
    主要idea是上層存儲器作爲其下層的緩存。
    這裏寫圖片描述

    操作系統

    兩個目的:

  • 保護硬件不受失控的應用程序的破壞;
  • 提供給應用程序簡單,統一的操作衆多硬件的方法;
    操作系統通過基本的抽象做到這一點。
    這裏寫圖片描述
  • Files:對IO設備的抽象,本質是字節序列。系統中所有的輸入輸出都是對文件的讀寫。
  • Virtual memory:對IO設備和主存的抽象;
  • Processes:對處理器,主存和IO設備的抽象;
  • Process (進程)

    進程是操作系統對一個運行的程序的抽象。處理器通過在不同的進程間切換(上下文切換 context switching)使得多個進程併發的執行;
    這裏寫圖片描述

    進程虛地址空間

    這裏寫圖片描述

  • 程序代碼和數據:所有進程的代碼都從同樣的固定地址開始;
  • Heap:堆,這部分空間在運行時由mallocfree分配和釋放;
  • shared libraries:共享庫,如C標準庫和math庫等。
  • Stack:用戶虛擬地址空間的最上層是棧,它在程序執行函數調用時分配,函數推出時釋放;
  • Kernel virtual memory:內核虛擬內存,應用程序不能讀或寫這部分空間,也不能直接調用其中的函數;
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章