第一章 電腦系統漫遊
1.1資訊就是位+上下文
來源程式實際上就是一個由0和1組成的位(又稱位元位)序列,這些位被組織成8個一組,稱為位元組。每個位元組都表示程式中某個文本字元。
系統中的所有資訊都是由一串位元表示的。區分不同資料對象的唯一方法就是我們讀到這些資料對象時的上下文。
1.2程式被其他程式翻譯成不同的格式
unix> gcc –o hello hello.c 翻譯成一個可執行目標檔案hello四個階段:
預先處理階段:前置處理器根據#開頭命令,修改原始程式,得到另一個程式,通常以i為副檔名。
編譯階段:編譯器將.i翻譯成.s檔案,包含一個組合語言程式。
彙編階段:彙編器將hello.s翻譯成機器語言指令。變成.o的二進位檔案,它的位元組編碼時機器語言指令而不是字元。
連結階段。將類似printf的函數(printf.o的單獨先行編譯目標檔案中)併入,結果的到hello檔案,是一個可執行目標檔案,可執行檔載入道儲存空間後,由系統負責執行。
1.3瞭解編譯系統如何工作是大有益處的
最佳化程式效能,理解連結時出現的錯誤,避免安全性漏洞。
1.4處理器讀並解釋存處在儲存空間中的指令
Cpu:中央處理單元;ALU;算術/邏輯單元;PC;程式計數器; USB:通用序列匯流排。
匯流排:匯流排攜帶資訊位元組並負責在各個組件間傳遞。通常匯流排被設計成傳送定長的位元組塊,也就是字。字中的位元組數是一個基本的系統參數,各個系統不盡相同。假定字長為4位元組,並且假設匯流排依次只傳一個字。
IO裝置:鍵盤滑鼠,顯示器,磁碟
主存:由一組DRAM晶片集成。儲存空間是由一個線性字結數組組成每個位元組都有自己唯一的地址(數組索引);這些地址是從零開始的。
處理器:CPU在指令的要求下可能會執行這些操作。
載入:從主存拷貝一個位元組或者一個字到寄存器,覆蓋寄存器原來的內容。
儲存:從寄存器拷貝一個位元組或者一個字到主存的某個位置,覆蓋這個位置上原來的內容。
更新:靠被兩個寄存器的內容到ALU,ALU將兩個字相加,並將結果儲存到一個寄存器中。
IO讀:從IO裝置中拷貝一個位元組或者一個字到寄存器。
IO寫:從一個寄存其中拷貝一個位元組或者一個字到一個IO裝置。
轉移:從指令本身中抽取一個字,並將這個字拷貝到程式計數器中,覆蓋PC中原來的值。
當輸入./hello後,shell程式就逐一讀取字元到寄存器,再把它存放到儲存空間中。
輸入會車後,shell執行一系列指令,這些指令將hello目標檔案中的代碼和資料從磁碟拷貝到主存,從而載入hello檔案,包括最終輸出的字串”hello,world\n”
一旦程式載入道儲存空間,處理器就開始執行主程式中的機器語言指令。這些指令將hello world\n中的位元組從儲存空間中拷貝到寄存器檔案,從寄存器檔案拷貝到顯示裝置,最終線時到螢幕
1.5快取
用來存放處理器在不久的將來可能會需要的資訊。
1.6形成階層的存放裝置
1.7作業系統管理硬體
可以把作業系統看成是應用程式和硬體之間插入的一層軟體,都依靠作業系統提供的服務。所有應用程式對硬體的操作嘗試都必須通過作業系統。
作業系統有兩個準系統,防止硬體被失控的應用程式濫用;在控制複雜而又通常廣泛不同的低級硬體方面,為應用程式提供簡單一致的方法。(進程,虛擬儲存空間,檔案)
檔案是對io裝置的抽象表示,虛擬儲存空間是對主存和磁碟io裝置的抽象表示,進程則是對處理器,主存和io的抽象表示。
進程是作業系統對運行程式的一種抽象。實際上一個進程的指令和另一個進程的指令是交錯執行的。交錯執行機制稱為環境切換。
環境切換:儲存當前進程的上下文,恢複新進程的上下文,然後將控制權轉移到新進程。新進程會從它上次停止的地方開始。
線程:一個進程由多個線程組成,每個線程都運行在進程的上下文中。共用同樣的代碼和全域資料。多線程比多進程之間容易共用資料。
虛擬儲存空間:是一個抽象概念,每個進程看到的儲存空間都是一致的,稱之為虛擬位址空間。
1.8利用網路系統和其它系統通訊