讀書筆記

計算機組成與設計:硬件/軟件接口
課程PDF  http://inst.eecs.berkeley.edu/~cs61c/fa13/算法

相似項目
一、Yale N. Patt, Sanjay J. Patel Introduction to Computing Systems: From Bits and Gates to C and Beyond
二、Randal E. Bryant, David R. O'Hallaron Computer Systems: A Programmer's Perspective
三、Umakishore Ramachandran, William D.Leahy.Jr. Computer Systems:An Integrated Approach to Architecture and Operating Systems windows

兩位做者介紹
美國加州大學伯克利分校計算機系Patterson教授和斯坦福大學計算機系Hennesssy教授是現今計算機設計領域很是受人尊敬的學者和開創者。John Hennessy精通硬件/軟件,是具備傳奇色彩的MIPS編譯器和幾代MIPS硬件產品的技術上的領導者。David Patterson是RISC最初提倡者之一。他創造了RISC一詞,定義了RISC的含義,是Sun公司SPARC處理器的主要顧問。他提出了RAID(廉價磁盤冗餘陣列),帶來了爲大量數據服務磁盤存儲的工業的革命,而且又提出了NOW(工做站網絡)的概念。sass

第二版特色
我的認爲這是閱讀體驗最好的一個版本。
從第三版起,不少內容被移入CD,想看就沒那麼方便了。
移入CD的內容包括陷阱與缺陷、歷史註記,尤爲歷史註記對於學習者瞭解發展狀況頗有幫助。安全

CPU的生產流程:製造Pentium芯片
網絡

性能評價:響應時間 vs. 吞吐量
DC-8飛機有最快的飛行速度,是波音的兩倍多,載客量至關於波音的1/3。
這個實例主要說明如何評價性能自己就不是簡單的事情。
通常而言,更新的處理器能夠帶來更快的響應時間。
同一硬件水平下,要增長吞吐量只能經過並行來實現。函數

 

amdahl定律
一個程序有A(20%)、B(80%)兩部分組成。
假定A是沒法改進的部分,那麼即使B部分改進到能夠忽略,這個程序也只能達到原有程序性能的5倍。佈局

 

mips指令集與指令編碼
mips指令集與x86區別很大。
mips的核心指令包含:
lw  $s0, 0($t0)  #load
sw  $s0, 0($t0)  #store
add $s0, $t0, $t1 # $s0 = $t0 + $t1
sub $s0, $t0, $t1 # $s0 = $t0 - $t1
slt $t0, $s3, $s4 # set s0 = 1 if $s3 < $s4
beq register1, register2, L1 # branch if equal
bne register1, register2, L1 # branch if not equal
做者採起的的是漸進式策略,一次一指令,最後展現的是一個完整的C/mips語言轉換。
mips沒有x86中的push pop,操縱stack的指令須要使用算術指令,load/store指令來完成。 性能

指令編碼,之因此包含這部分,是爲下面處理器設計章節作鋪墊。學習

 

數的表示與ALU構造
整數的2補碼錶示。this

 

整數乘法/除法的實現。
按部就班展現了三個不一樣的設計,每次一改進。
本質而言,計算機就是算法。
硬件設計方面追求高效、簡潔。

 

浮點數與IEEE754
這部分最精彩的是歷史註記部分。
例如7094的浮點設計缺陷如何使得一篇航空動力設計的論文結果一波三折。
s/360的硬件設計因爲節約了4個位,反而計算精度不及7090.
Gray的超級機器要想編寫出程序,必須使用一些「範式」。
intel奔騰處理器浮點錯誤,intel使用查表法來進行浮點計算,工程師本覺得不多用到的地方能夠安全去除,結果事情的處理最終失控。
因此,實現IEEE浮點規範是很難的。
kahan說了一句意味深長的話:設計者每每把不得不作的事情說成是精心設計的結果。

 

數據通路:構造處理器
這部分很顯做者的水平,從高度抽象的概念出發,暫時忽略細節來解決問題。
douglas e. comer也是這個方面的高手。

 

單週期設計
實現mips核心指令:load/store、add/sub、beq
先實現單個功能:經過組合線路。
再使用多路複用器將全部部件合成一體。
控制器的實現:時序線路。
根據操做碼(對於R型指令,還要考慮功能碼),對不一樣多路複用器施以不一樣信號,
這樣整個數據通路就暫時成爲實現 load/store、add/sub、beq中的某一特定指令的部件。
數據通路的執行在一個時鐘週期內完成,若是須要更新寄存器、存儲器,更新後的值須要下一clock cycle 可見。

 

多週期設計
單週期執行時間強制全部指令按最慢指令節奏執行,顯然沒法提供足夠好的效率。
多週期方式能夠改善這一點。
爲了實現多週期,原有數據通路能夠簡化,指令、數據存儲器合二爲一,ALU和原有的兩個加法器如今只使用一個ALU。
至於怎麼實現多週期控制,解決地方法就是有限狀態機。
有限狀態機有着若干狀態,根據輸入信號,跳轉到下一狀態。
一個超市收銀員就是一個有限狀態機,沒輸入的時候保持休閒狀態,有顧客進入工做狀態,一個顧客結束後算完成一個週期。
再接收新的輸入。

 

FSM
狀態機的實現使用數字邏輯就能夠實現。
處理器的另外一處理方式就是將控制器的設計轉化爲軟件編寫。
使用EDA軟件編寫微碼程序,編譯,生成有限狀態機。

 

exception
不管來自機器內部仍是外部的控制流中任何意外的改變,mips中成爲異常。
來自處理器外部的事件稱之爲中斷。

 

未完待續...

 

 

2、迷宮與回溯總結

整理筆記本代碼

 

3、數學閱讀總結

微積分:從牛頓到勒貝格
牛頓以前已有積累,牛頓作出了關鍵一步:從特殊到通常的推廣。
萊布尼茨原來是一位業餘數學家,不過迅速學習而迎頭遇上。

 

技巧高超的歐拉,尤爲是無窮級數推導,鬼斧神功!
第一回合:不夠嚴謹,例如無窮小量的處理,開始推導時這個量不等於0,推導到最後一步時忽然成了0,
大主教貝克萊主要憑此一點發起論戰,這位貝克萊有理有據,其實他也是中國人民的老朋友,常常在教材裏客串反派腦殘人士。

 

拉格朗日:以無窮級數代替推導過程。
柯西:第二階段的明星人物。使得微積分的引入更嚴謹。
柯西改進了極限的概念,承上啓下。
柯西還證實了介質定理,提出了無窮級數收斂性斷定條件。

 

黎曼:繼續改進。
威爾斯特拉斯提出了一病態函數:該函數到處連續,卻不可導。
威爾斯特拉斯的工做條件優厚:本人口述,助手板書。

 

康拖提出集合論。
勒貝格,到這裏徹底看不懂。
結束。

 

要說技巧的話,無窮級數具備良好的應用價值,可據此使用計算機推導函數值。
若是計算機未提供此等函數,可自行寫出自定義函數。

 

統計學
我先看了兩本科普書,感受英國人比日本鬼子水平高太多。
日本鬼子還停留在解題層次;英國人則能夠將來龍去脈以淺顯語言講解出來,探究的是世界的運做原理。
正態分佈,泊松分佈、抽樣、chi square驗證。
也翻了圖書館一些統計學導論型教材,至少感受不那麼神祕了。
先鞏固下之後再系統學習。

 

Reversing: Secrets of Reverse Engineering
Eldad Eilam
看了前四章及所有附錄。
附錄主要是高級語言與彙編語句的轉換。

if
if else
switch
while
for

 

x86 disassembly(wiki book)有詳細事例。
函數調用約定:

cdecl C調用約定,參數從右到左入棧,調用者清棧。便於變長參數處理。

add(2, 3);
cdelcl int add(int a, int b){
         return a+b;
}

 

push 3
push 2
call _add
add esp, 8

 

_add:
push ebp
mov ebp, esp
mov eax, [ebp+8]   # a
add eax, [ebp+12]  # b
mov esp, ebp
pop ebp
ret

 

stdcall win32最多見調用約定,最早爲microsoft自行使用,後來得到不少編譯器支持。
         參數從左到右入棧,被調用者自行清理堆棧。函數末尾會有 ret n相似指令。
fastcall 頭兩個參數使用 ecx edx來傳遞,餘者發往堆棧。參數從右到左入棧。caller清棧。
thiscall ecx傳遞object指針,C++成員函數的標準作法。先ecx傳遞this指針(object地址),參數從右到左推入堆棧。
X64 call X64call是64位調用約定,因爲x64 cpu通用寄存器數目由32位cpu的8個增長到16個,因此只此一種調用約定。

 

函數堆棧調用幀數據佈局
以此:參數,eip,ebp,局部變量。

 

如何根據函數彙編代碼辨別C++虛函數機制
做者的示意圖很棒。

 

前四章前兩章沒什麼說的,第三章windows工做原理信息量挺大,看來還需努力。
主要是PE文件結構,RVA什麼的,還須要看看相關文獻。

 

第五章才正式進入主題,以逆向ntdll.dll一組函數爲例詳細說明了逆向的具體作法,顯然做者是一個誨人不倦好老師。
經常我感受沒什麼大礙的地方做者會有重大發現:這就是新手和專家之間的距離。

 

個人感受是真要作的話,用鉛筆和繪圖紙已經沒法完成這個等級的工做,必須用電腦才能夠,不然很難跟蹤,由於信息不斷在更新。
不過大概看下來自覺在看彙編語言已經和之前不一樣層次了。
目標已完成,因此暫時就不看了。
weiley果真良心出版社,並且這位俄國人的英語至關流暢,雖然身居腐朽的帝國主義國家,寫做是敬業的。

 

個人其餘讀書計劃還包括:

C++ Primer 目前進度:40%
The C++ Standard Library 這個應該比Primer更容易,書中代碼插圖不少
Windows via C/C++ 目前進度:60%
Windows System Programming 補充win32 API
Programming Challenge
How to Think algorithms
Essential COM
Windows Internals

相關文章
相關標籤/搜索