簡介
操作系統對硬件進行管理和抽象,提供易用的接口同硬件一起為應用程序提供服務,從而使得上層應用程序無需關注硬件的具體操作方法
- 操作系統將不同功能的硬件設備進行統一管理,將I/O設備抽象為文件,將物理內存抽象為連續的虛擬內存,可以使應用程序通過簡單而統一的接口操作底層復雜的硬件,同時保護硬件不被失控或惡意應用濫用
- 操作系統為應用提供不同功能的接口,應用通過接口實現對底層復雜設備的操作,使得應用程序只關注於應用的實現,而無需關注具體的硬件型號等。同時也管理應用的加載、啟動、切換、調度和銷毀,訪問控制、應用之間的交互等
操作系統定義
現代操作系統分為操作系統內核與操作系統框架
- 內核對硬件資源進行管理與抽象,為操作系統框架提供基礎的些系統服務
- 操作系統框架為應用提供多種編程接口與運行環境
硬件
上面提到硬件與操作系統協同一起為應用程序提供服務,所以簡單了解相關硬件結構也是必要的
總線(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
- 預處理:通過預處理器將頭文件stdio.h的內容插入到hello.c程序文本中,輸出為hello.i
- 編譯:編譯器將hello.i翻譯成匯編語言程序,輸出位hello.s
- 匯編:匯編器將hello.s翻譯成機器語言指令,並打包為二進制文件hello.o
- 鏈接:hello程序調用c標准庫提供的printf函數存在於預編譯好的printf.o文件中,連接器將printf.o合並到hello.o中,得到可執行文件hello,hello才可以被加載到內存中由系統執行
運行hello程序
- 在鍵盤輸入"./hello",shell程序將字符讀入寄存器后放到內存中
- 敲擊回車,shell開始執行指令,加載可執行文件hello,這些指令將hello中的代碼和數據("Hello World!\n")從磁盤復制到內存
- 程序加載完成后,處理器執行hello程序main函數中的機器指令,這些指令將"Hello World!\n"從內存復制到寄存器,再從寄存器復制到顯示器
總結
沉寂了一段時間,在處理問題的時候,總是知其然而不知其所以然(可能因為大學時候划水嚴重吧=、=),感覺需要提升一下內力了,工作之余蜻蜓點水般過了一些操作系統網絡和數據結構的知識,回來再對重點內容各個擊破,做下筆記與分享,先從操作系統開始吧~
學習自:
《現代操作系統:原理與實現》陳海波,夏虞斌
《深入理解計算機系統》(美)蘭德爾·E.布萊恩特(Randal E.Bryant)