標籤:cpu 作業系統 記憶體 api abi
眾所周知,對於馮·諾依曼體繫結構的現代電腦而言,主要的組成部分是:cpu、記憶體和I/O。作為電子元器件,cpu和記憶體識別二進位中的1和0都是通過電壓的有無來實現的,因此電壓在有無之間變換頻率的快慢或者說這些元器件能識別這些變換頻率的能力直接影響著電腦處理資料的能力。
CPU
猶如人體的大腦一樣,cpu在整個電腦的運行過程中起著至關重要的作用,這些作用包括計算功能和控制功能。然而,就像吃飯時要有一個器具盛米飯一樣,當CPU進行計算的時候,必須有一個類似的容器,當表示第一個資料的位元(電壓)流消失以後能夠將其緩衝起來與下一個資料做運算,這個安放在CPU裡面的容器就叫做寄存器,實現運算功能的組件叫做運算器。當然,對於電腦內部的元器件來說,要想實現資料的處理必須經過CPU,因此CPU要有與各個組件相連的通道,為了讓儘可能少的線部署在有限的空間裡面,我們用一組線來貫穿整個電腦,所有的組件都與其相連,這組線稱為:匯流排。對於這樣的匯流排結構,必然存在協調收發的衝突檢測和避免機制,就好像我們在車流量較大的主幹道要有紅綠燈來指揮交通一樣,在電腦內部,這個指揮交通的元器件叫做控制器,其他組件上有一個接受控制器命令的控制單元。
記憶體
在電腦內部,CPU能直接存取的只有記憶體,因此CPU需要能精確的在記憶體中找到需要處理的資料,所以記憶體是編址的。一個記憶體被分為N個Cell,每一個Cell包含8bits並且都有一個地址,控制器通過地址匯流排串連到記憶體控制器,如果一個記憶體控制器輸出32根線(32位),那麼定址能力就是4G.
作業系統
對於每一個硬體,它的運行規格不一樣,比如:不同廠商的CPU對於機器碼的識別方式不同,可能相同的0和1組合一個表示加,一個表示減。於是對於早期的程式員來說要想實現一個應用程式的邏輯必須瞭解開發平台上所有硬體的機器碼識別方式,這一點是非常困難的。同時廠商千千萬,在一個特定硬體組合平台上開發的程式不可能移植到其他的硬體平台上,要解決這個矛盾必須開發一個中介層,向下能驅動所有的硬體裝置,向上提供統一標準的介面,通過這個統一的介面來驅動底層硬體的過程稱為系統調用(system call),這個中介層通俗的稱呼是:作業系統,在Linux中叫做Linux核心。
作業系統提供了應用程式和底層硬體互動的平台,它能夠驅動所有的底層硬體,同時最重要的是能夠通過分時的方式管理CPU,讓各個應用程式協調工作。雖然都是中介層,但是Linux和windows向上提供的統一介面標準不同,所以一個應用程式根據作業系統的不同會有windows32/64和Linux32/64等幾個版本。
API和ABI
如前文所言,即使能夠驅動不同廠商的硬體,我們的作業系統(核心)的介面依然非常底層,比如word需要用到列印功能,excel也需要用到相同的功能,那麼就需要把所有廠商的列印介面能實現的列印功能統一用一種通用規範表示出來,這些通用規範叫做:庫。庫提供向上的介面稱為API,程式員通過API調用庫。POSIX是是目前通用的API執行規範,由IEEE規定,相容Windows和Linux,syscall和libcall屬於API範圍。
應用程式直接運行在硬體上面,但是依賴於作業系統提供的環境,而且受制於作業系統的管理,這個環境稱為:ABI。windows上的執行程式支援的是exe,msi格式,而Linux上支援的是ELF格式的,每一個應用程式都有一個執行入口,表明所支援的二進位格式。
簡而言之,在windows上開發的來源程式,在Linux上能編譯,需要兩邊的API要一樣,在windows上開發在windows上編譯在Linux上要能運行,兩邊的ABI要一樣。
本文出自 “蝸牛小飛俠” 部落格,轉載請與作者聯絡!
簡述電腦運行機制