程序翻譯成不同格式
在unix系統上,從源文件到目標文件的轉化是有編譯器驅動程序完成的。
命令:gcc -o hello hello.c 這裏GCC編譯器驅動將hello.c翻譯成一個目標文件hello,這個過程可分爲4個步驟
- 預處理階段:根據#開頭的命令修改成宿 如#include<stdio.h>,讀取系統頭文件插入程序文本中
- 編譯階段:講程序hello.i翻譯成hello.s,也就是翻譯成彙編語言
- 彙編階段:將hello.s方已成機器語言指令並打包成hello.o
- 鏈接階段:比如hello程序調用了printf函數,printf函數存在於一個名爲printf.o的單獨的預編譯好了的目標文件中,這個文件需要合併到hello.o的程序中,ld就負責這種合併,得到hello文件,可以被加載到內存中,由系統執行。
系統的硬件組成
總線
貫穿整個系統的一組電子管道,總線被設計成傳送定長的字節快,也就是字。
I/O設備
系統和外部聯繫通道,如鼠標鍵盤,顯示器磁盤等等。一般io設備都會通過適配器和控制器與I/o總線相連
主存
臨時存儲設備,用來存放和程序處理的數據,從邏輯上說,存儲器就是一個線性的字節數組
處理器
cpu,處理器的核心是一個大小爲一個字的存儲設備,成爲程序計數器,任何時候程序計數器(PC)都指向主存中的某條機器語言指令。
高速緩存
機械原理:較大的存儲設備要比較小的存儲設備運行得慢,而快速設備的造價遠高於同類的低速設備。
高速緩存用於緩解主存和處理器之間速度不匹配的問題
進程
進程是操作系統對一個正在運行的程序的一種抽象,是一系列指令的集合。進程的切換是由操作系統內核管理的,內核是操作系統代碼常駐主存的部分。比如應用程序需要操作系統的某些操作時,比如讀寫文件,它就執行一條特殊的系統調用指令,將控制權給內核。然後內核執行請求並放回給應用程序。內核是系統管理全部進程所用代碼和數據結構的集合。
線程
一個進程可以由多個線程組成,每個線程都運行在進程的上下文中,並共享同樣代碼和全局數據。
進程的虛擬地址空間,從底地址開始:
程序代碼和數據:代碼和數據區是直接按照可執行目標文件的內容初始化的。該區在進程一開始運行的時候就被指定大小。
堆
當調用了malloc和free時,堆可以在運行時動態的擴展和收縮。
共享庫
存放像C標準庫這樣的共享庫的代碼和數據的區域。
棧
編譯器用它來實現函數調用。和堆一樣,可以動態的擴展和收縮。調用一個函數時,棧就會增長,從一個函數返回,棧就收縮。
內核虛擬內存
位於複製空間頂部,用戶代碼不可見的內存(應用程序不可讀寫),爲內核保留的。基本思想把一個進程虛擬內存的內容存儲在磁盤上,然後用主存作爲磁盤的告訴緩存。
文件
文件就是字節序列,每個I/o設備都可以看做是文件,例如:鍵盤,顯示器甚至網絡,系統中的所有I/O操作都是通過 一組稱爲Unix I/O系統的函數調用讀寫文件來實現的。
計算機中的抽象
文件是對I/O設備的抽象,虛擬內存是對儲存的抽象,進程是對一個正在運行的程序的抽象,虛擬機是對計算機的抽象。