資訊時代的世界,有著光鮮亮麗的外殼。web2.0的時代,搜尋引擎,sns,流**...這絢麗多彩的一切,流光溢彩,彷彿雲霓燦爛。
剝去這光鮮的外殼,深入到底層的世界。核心,體系結構,編譯器...完全是0和1組成的黑白世界,初涉之難免覺得味同嚼蠟。
但是,正如單一的白光在三稜鏡下,會綻放出七彩的光譜,黑白的計算機底層世界,卻有著魔法一般豐富的內涵。當我們看穿華麗的gui介面的偽裝,**到核心的奧秘時,我們會發現這是乙個迷人的微觀世界。這個美麗新世界,最具魅力的是哪些呢?
體系結構。它是計算機系統的基石。它從根本上決定了這個系統的效能。當程式中出現錯誤時,對體系結構的理解,能大大加快bug的定位。體系結構是底層世界的根基。
作業系統。它是計算機系統的靈魂。作業系統遮蔽了底層硬體的差異,為上層軟體提供了統一的api。多工作業系統還可以讓計算機並行處理不同的任務,巧妙的設計可以發揮cpu最大的潛力。目前的最新作業系統版本,還可以支援多cpu併發處理。作業系統核心是底層世界的統治者。
編譯器。編譯器是體系結構的翻譯官。它能夠將高階語言翻譯成機器指令,與作業系統提供的api介面連線,開發出各種應用程式。好的編譯器還可以針對硬體做優化。編譯器是底層世界的一把密鑰匙。
體系結構,作業系統,編譯器支撐起的系統,如同三隻足支撐的乙隻鼎。作業系統中的經典之作,是linux;對應的編譯器是gcc系列工具鏈。關於這些的著作早已汗牛充棟。我想給大家介紹的,是體系結構皇冠上的明珠——mips。
英國科學家dominic sweetman(經典著作see mips run的作者),稱mips為「高效的risc體系結構中最優雅的一種體系結構」。它是乙個雙關語:即是microcomputer without interlocked pipeline stages的縮寫,同時又是millions of instructions per second的縮寫。
mips的處理單元是乙個五級流水線:instruction fetch, register & decoder, alu, memory以及write back。一開始的mips是為32位系統設計的,實際上,後續的64位擴充套件,也依然對32位的工作模式向下相容著。一如其他的risc處理器,mips的每條指令長度是固定的32bit。(因此,最長的區域性跳轉指令只能跳轉2的26次方byte,也就是2的24次方,16777216條指令)
mips有32個通用暫存器,程式設計者可以使用其中除$0外的所有暫存器暫存資料。$0暫存器,在硬體上被設計為永遠讀出0。我們可以用$0暫存器的此特性,實現一些技巧性的程式設計,譬如實現nop操作。mips本沒有nop指令,但由於對$0暫存器的寫入實際上無意義,可以作為空操作使用。
事實上,編譯器從高階語言(典型如c/c++)轉換為mips彙編指令時,一般總是遵守一定的暫存器使用約定。某些暫存器用來從函式中傳入和傳出引數,儲存臨時資料,另一些則起特殊作用,如儲存呼叫函式時的指令位址,或作為堆疊指標等。如果你使用彙編開發,理論上可以無視這點約定,但是,一般地,遵守這個約定,與人方便,也為己方便。關於暫存器使用的約定,以後會展開論述。
一如所有的risc處理器,mips沒有cisc那樣複雜多變的定址方式,統一為load/store定址。任何載入和儲存操作,都可寫為如下形式:
lw $1, offset ($2)
這條指令的操作符可以為load或store,一次load/store操作的範圍可以為字/半字/位元組(對應gcc的int, short和char)。偏移量是乙個帶符號的16bit整數。兩個作為運算元的暫存器可以是任何通用暫存器。(你可以向$0寫入,但無任何意義,等同於空操作)。對於64位模式下,也可以對double型別進行操作。注意load/store都必須對應乙個對齊的位址,否則會引發乙個異常(exception)。
mips支援最多4個協處理器。協處理器cp0為cpu的控制協處理器,是體系結構中必須實現的。cp1為浮點處理器。cp2保留,各生產廠商往往用來實現一些自己的特色功能,例如rmi的fast message ring等。cp3原本也是保留共擴充套件用,但很多mips iii和mips iv時代的擴充套件指令集使用了它。對於cp0,我們會有專門的一段用來討論。
為適應處理器向多核時代的演進,mips引入了多核操作必要的原子指令(atomic operation)、記憶體屏障(barrier)等操作。在smp或amp等多核架構中,這些指令是平行計算同步的保障。
深入淺出sizeof
int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...
深入淺出ShellExecute
ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...
深入淺出ShellExecute
深入淺出shellexecute譯者 徐景周 原作 nishant s q 如何開啟乙個應用程式?shellexecute this m hwnd,open calc.exe sw show 或shellexecute this m hwnd,open notepad.exe c mylog.log...