作業系統學習(1)-概述

Hui_Tong發表於2021-09-16

簡介

作業系統對硬體進行管理和抽象,提供易用的介面同硬體一起為應用程式提供服務,從而使得上層應用程式無需關注硬體的具體操作方法

  1. 作業系統將不同功能的硬體裝置進行統一管理,將I/O裝置抽象為檔案,將實體記憶體抽象為連續的虛擬記憶體,可以使應用程式通過簡單而統一的介面操作底層複雜的硬體,同時保護硬體不被失控或惡意應用濫用
  2. 作業系統為應用提供不同功能的介面,應用通過介面實現對底層複雜裝置的操作,使得應用程式只關注於應用的實現,而無需關注具體的硬體型號等。同時也管理應用的載入、啟動、切換、排程和銷燬,訪問控制、應用之間的互動等

作業系統定義

現代作業系統分為作業系統核心與作業系統框架

  • 核心對硬體資源進行管理與抽象,為作業系統框架提供基礎的些系統服務
  • 作業系統框架為應用提供多種程式設計介面與執行環境

硬體

上面提到硬體與作業系統協同一起為應用程式提供服務,所以簡單瞭解相關硬體結構也是必要的

匯流排(Bus)

匯流排就像血管一樣貫穿整個計算機硬體系統,連線著處理器、主存、I/O裝置等硬體部件,傳送定長的位元組塊(32位機器是4個位元組,64位機器是8個位元組)

I/O(Input and Output)裝置

鍵盤、滑鼠、顯示器、網路卡、磁碟均屬於I/O裝置。I/O裝置通過控制器(裝置本身或主機板上的晶片組)或介面卡(插在主機板上的卡)與I/O匯流排相連,負責從外界獲取輸入,將結果輸出到外界

儲存器(memory unit)

儲存器包括暫存器、CPU快取、記憶體等。在處理器執行程式時,負責存放程式和程式處理的資料,儲存程式執行的中間結果和最終結果。從邏輯上來講,儲存器是一個線性位元組陣列,陣列索引為每個位元組的地址

中央處理器(Central Processing Unit,CPU)

CPU包括暫存器、程式計數器(PC)、算術/邏輯單元(ALU)。暫存器用來儲存一個位元組;PC指向儲存器中要執行的一條指令,由處理器執行這條指令;ALU負責運算,處理器的常見操作:

  • 載入:從記憶體複製一個位元組到暫存器,覆蓋暫存器原來的內容
  • 儲存:從暫存器複製一個位元組到記憶體的某個位置,覆蓋記憶體原來的內容
  • 操作:把兩個暫存器的內容複製到ALU,ALU對這兩個位元組做算術運算,並將結果放到一個暫存器中覆蓋暫存器原來的內容
  • 跳轉:將跳轉指令複製到PC中,覆蓋原有的值,處理器執行該指令

執行一個Hello World

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
    return 0;
}

這是一個通過編輯器建立並儲存的文字檔案hello.c,但這個檔案並不能執行,需要被編譯器轉化為機器語言指令並按照可執行目標程式的格式打包好,以二進位制檔案的形式儲存在磁碟上。

執行gcc -o hello hello.c

  1. 預處理:通過前處理器將標頭檔案stdio.h的內容插入到hello.c程式文字中,輸出為hello.i
  2. 編譯:編譯器將hello.i翻譯成組合語言程式,輸出位hello.s
  3. 彙編:彙編器將hello.s翻譯成機器語言指令,並打包為二進位制檔案hello.o
  4. 連結:hello程式呼叫c標準庫提供的printf函式存在於預編譯好的printf.o檔案中,聯結器將printf.o合併到hello.o中,得到可執行檔案hello,hello才可以被載入到記憶體中由系統執行

執行hello程式

  1. 在鍵盤輸入"./hello",shell程式將字元讀入暫存器後放到記憶體中

  1. 敲擊回車,shell開始執行指令,載入可執行檔案hello,這些指令將hello中的程式碼和資料("Hello World!\n")從磁碟複製到記憶體

  1. 程式載入完成後,處理器執行hello程式main函式中的機器指令,這些指令將"Hello World!\n"從記憶體複製到暫存器,再從暫存器複製到顯示器

總結

沉寂了一段時間,在處理問題的時候,總是知其然而不知其所以然(可能因為大學時候划水嚴重吧=、=),感覺需要提升一下內力了,工作之餘蜻蜓點水般過了一些作業系統網路和資料結構的知識,回來再對重點內容各個擊破,做下筆記與分享,先從作業系統開始吧~

學習自:
《現代作業系統:原理與實現》陳海波,夏虞斌
《深入理解計算機系統》(美)蘭德爾·E.布萊恩特(Randal E.Bryant)

相關文章