我眼中的計算機

2020-08-12 07:39:33

粗看計算機

計算機的種類其實很豐富,手機、PC、伺服器甚至你家的智慧家電都是一個計算機。這裏以PC作爲例子來講述我眼中的計算機。

拆過或者裝過電腦的人都知道,PC包括CPU、記憶體、硬碟、主機板、GPU、USB介面等等,甚至還有TPM模組等安全晶片。但這樣去看一臺計算機,還是過於簡單了。還是得整點原理性的東西。

我將主要講講CPU、OS的故事

硬碟

硬碟有常見的機械硬碟、固態硬碟,機械硬碟是通過磁信號來儲存數據的,固態硬碟是基於快閃記憶體技術,通過電信號來記錄數據。硬碟在斷電情況下是不會丟失數據的。

我們往往會將OS從硬碟的0位置開始儲存(比如機械硬碟中的0磁軌0磁區)。實際上,Linux0.11中,在我們按下開機按鈕那一刻,我們會先載入0xFFFF的一段程式碼,它會將從0位置開始的OS給載入起來。爲什麼是0xFFFF,這就是歷史原因以及廠商之間的協商和約定形成的。可以參考《Linux內核設計的藝術》

記憶體

記憶體儲存了我們實際要跑的正在執行的程式碼,比如操作系統和你的程式,操作系統最初會儲存在硬碟中,就像一個木偶,只有載入到了記憶體,它纔是個活生生的「人」。

記憶體中的數據是斷電時會消失的,它的作用在於它比硬碟速度快,能夠更好地與CPU合作完成任務,完成「取值執行」的任務。不過後來快取又出現了。

比如我的記憶體條是海力士的,上面鑲嵌着4顆花了我血汗錢的記憶體顆粒。

主機板

主機板是各類硬體之間的鏈接橋樑,將記憶體、硬碟、CPU、GPU等等進行了鏈接。主機板本身起到瞭解耦的過程,將一整個計算機解耦成若幹個硬體裝置。

主機板就像一個橋樑,連線着你我他。溝通的協定有PCIE協定等,非常出名的協定包括NVME,現在常見的固態硬碟都用的這個協定,好處是快,真的很快!現在一般用的都是M.2介面了,幾年前還是SATA介面比較多。

CPU

CPU可謂計算機的大腦、靈魂。CPU本身就是一個很長的故事了。

CPU是通過無數多的電晶體組成的,我們表面看過去是一個亮閃閃的硅片,實際上裏面的電路複雜的很。

CPU的電晶體CMOS包括了N溝道、P溝道。CMOS管能夠幫助我們實現與、或、非三種位運算邏輯。這三種位運算邏輯向上構建起紛紛擾擾的計算機的大千世界。

CPU的硬體電路涉及語言主要是Verilog語言,與C語言等的最大區別在於,Verilog語言中的所有變數都是一個個具體的電路(你可以類別導線),電路與電路之間是沒有先後 先後關係的,所有操作是併發完成的。

CPU的工作說簡單其實也簡單,說複雜就很複雜了。總的來說CPU完成取值、執行兩步操作,不過如今的CPU至少包括了取值、譯碼、執行、訪存、寫回這幾步,實際中可能還遠遠不止。爲什麼要這麼做呢,主要是爲了提升CPU內部各個硬體模組之間的各步驟之間的併發程度,提升頻率。簡單地說就是爲了讓你CPU在成本基本不變的情況下,通過結構的改進,讓CPU跑的更快。

爲了進一步提升效能,CPU中增加了ALU旁路、記憶體旁路等結構,讓CPU能夠更好地偷懶,不過主要也是爲了提升CPU速度。

此外,Intel所基於的CICS指令集爲了效仿RISC指令集短小高頻的優勢,提出了微碼的概念,因此多了一層CICS到微碼的翻譯過程。

什麼,速度還不夠快?那麼就讓指令亂序執行吧,但是仍需要保證指令順序提交,畢竟程式碼指令的邏輯不能亂。這裏有保留站來儲存每個運算單元的待執行指令,順帶還需要記錄指令間的依賴關係(比如數據依賴等)。如果只有保留站,那麼順序提交其實變得很麻煩,那麼我們就增加一個Reorder Buffer,它來接受所有亂序執行的結果,並按照順序提交指令,也就是說,對於你拿去杯子、喝水兩個先後 先後的邏輯不能被亂序成了你先喝水,然後拿起杯子,提交的時候依然按照先拿起杯子後喝水的順序。

CPU提速的腳步從未停下,後來CPU中又被增加了快取結構,常見的三級快取,很多人的CPU都是三級快取,大小在4M、8M等等。往往三級快取中的第一級L1是CPU核獨享的,而第三級LLC(Last Level Cache)是多個CPU核共用的。快取與記憶體之間的對映關係常採用組相連對映,因爲實踐證明它比全相聯、直接相聯效果更加Nice。快取的層級設定以及大小設定也是經驗決定的,當然是考慮在儘可能低的成本下,畢竟CPU太貴的話,買的人可能就少了。

什麼,速度還不夠快?我們發現MMU對虛實地址轉換速度很慢,那麼就加上TLB把,專門用來儲存虛擬地址到實體地址的直接翻譯結果,不再需要MMU來慢吞吞的翻譯了,我們直接查TLB就行了。不過TLB就好比一個小表格,裏面能存的數量有限。最後值得一提的是TLB就好比是頁表機制 機製的快取。

裝置通過CPU來訪存太慢怎麼辦?那麼就用DMA直接記憶體存取,外設和記憶體之間直接去做朋友吧,省去CPU這個中間商(賺差價)。

CPU後來還提供了多核。我一個CPU裏面比如有4、8個核,沒每一個核都好比一個CPU,可以單獨執行進程任務。一般10個核這個量級稱爲多核,再多就叫做衆核了。

4個核遠比一個強,因爲他能同時處理4個任務了。還不夠快?那麼就有了超執行緒技術,我們發現CPU核經常有偷懶空轉的時候,嚴格的監工絕不允許CPU核偷懶,那麼CPU核你就去做兩個任務把,你平時跑A執行緒,你偷懶的時候就去跑B執行緒吧。事實上,多執行緒對閒置的運算單元、訪存單元等的進一步利用,不過後來爲了支援多執行緒,CPU廠商往CPU中加入了更多的運算單元(???你這不是在套娃嗎?)

什麼,你還覺得不夠快?那麼多花一些大洋去買Intel至強處理器吧,實在不行去買一臺超級計算機?。

CPU向上會提供指令集給上層軟體具體使用,比如x86指令集、MIPS指令集(被龍芯買斷了)、ARM、RISC-V等等。

那麼誰來使用硬體指令集呢,當然是操作系統和你開發的程式咯~

CPU擴充套件和其他

CPU的研發不能止步,Intel對它的CPU後續提出了各種擴充套件功能,比如SSE(Streaming SIMD Extensions)、MPX等等。包括我最近主要在研究的Intel SGX。

我有一個夢想,希望有朝一日,安全也能夠成爲主流,大家買產品的時候看A比B多了某某安全功能,然後就都買A。那麼就能讓我們安全從業人員,尤其是底層安全從業人員能夠找到工作,實現自我價值(自閉ing)。

哦,對了。多數CPU也面臨着比如Meltdown、Spectre等側通道攻擊,這是前兩年的熱點話題。

操作系統

操作系統本身是一具木偶,躺在硬盤裏面0開始的位置。不過我們按下開機按鈕的時候,我們會從0xFFFF的位置將操作系統從硬碟0位置開始放到記憶體0開始的位置中。

然後會有中斷向量表的初始化等等。

最終會有真實模式到保護模式的轉變。這是一個巨大的蛻變。會構建起中斷描述符表IDT、全域性描述符表GDT等等,此外關鍵的還有一個頁表機制 機製,頁表機制 機製的作用是讓每一個進程都能擁有4G的地址空間。你看躺在主機板上的記憶體條它可能也只有4G空間(不好意思,我的是16G),你看到的是實體記憶體,進程看到的是虛擬記憶體,虛擬記憶體是操作系統、編譯器給進程提供的記憶體的抽象,進程自以爲擁有4G記憶體,實際上,大部分所謂的記憶體還躺在硬盤裏,只有最近在使用的躺在實體記憶體裡,這個虛擬地址到實體地址的翻譯過程有CPU中的MMU硬體來實現。這裏用到了著名的區域性性理論。

進程看到的記憶體佈局可以參考我的另一篇博文《Linux記憶體機制 機製淺見——從記憶體佈局到執行緒區域性儲存TLS

操作系統之後會進一步完善中斷向量表,比如來自滑鼠鍵盤的硬體中斷(也叫非同步中斷),來自除零錯、缺頁中斷的軟中斷(也叫異常、同步中斷)。還會建立進程0,所有進程的父親,進而繼續建立進程管理機制 機製和進程1等等。有點像道生一,一生二,二生三,三生萬物。

最後操作系統會執行你給的軟體,然後賣力的工作。

我們聯想一下計算機的遠古時代,沒有分頁機制 機製保護模式等等,那個時候所有的程式亂成一鍋粥的執行。是不是可以看到操作系統的一個巨大的進步。

Linux系統提供了UGO存取控制,它能夠幫助你更好地管理包括你的檔案在內的各種大大小小的重要或者不重要的資源。

Android系統是基於Linux內核,額外提供了安卓執行時和庫等等,此外在UGO存取控制基礎上提供了許可權機制 機製,比如你的某個APP申請存取你的相機等等。

軟體

有了操作系統和CPU等軟硬體,你就可以開啓你的瀏覽器,看看網頁,比如我的部落格,你也可以開啓PUBG、LOL。

其他還有啥

目前想不到了。希望大家支援國產,中國第一臺自主的計算機,龍芯CPU+統信OS+某某的外機似乎已經開始商用了。我們中科院軟體所基礎軟體實驗室的CPU、OS也在努力推進中,雖然我們的第一代CPU據說跑了Linux沒幾分鐘就冒煙了。

龍芯最新的處理器號稱已經達到了Intel、AMD主流的效能水平,網友們紛紛表示龍芯Yes。不過國產CPU似乎擴充套件特性不太有,安全擴充套件特性更不太有。

但是,總之。龍芯Yes,國產CPU Yes!