读书笔记

计算机组成与设计:硬件/软件接口
课程PDF  http://inst.eecs.berkeley.edu/~cs61c/fa13/

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

两位作者介绍
美国加州大学伯克利分校计算机系Patterson教授和斯坦福大学计算机系Hennesssy教授是现今计算机设计领域非常受人尊敬的学者和开创者。John Hennessy精通硬件/软件,是具有传奇色彩的MIPS编译器和几代MIPS硬件产品的技术上的领导者。David Patterson是RISC最初提倡者之一。他创造了RISC一词,定义了RISC的含义,是Sun公司SPARC处理器的主要顾问。他提出了RAID(廉价磁盘冗余阵列),带来了为大量数据服务磁盘存储的工业的革命,并且又提出了NOW(工作站网络)的概念。

第二版特点
个人认为这是阅读体验最好的一个版本。
从第三版起,很多内容被移入CD,想看就没那么方便了。
移入CD的内容包括陷阱与缺陷、历史注记,尤其历史注记对于学习者了解发展情况很有帮助。

CPU的生产流程:制造Pentium芯片
读书笔记_第1张图片

性能评价:响应时间 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补码表示。

 

整数乘法/除法的实现。
循序渐进展示了三个不同的设计,每次一改进。
本质而言,计算机就是算法。
硬件设计方面追求高效、简洁。

 

浮点数与IEEE754
这部分最精彩的是历史注记部分。
例如7094的浮点设计缺陷如何使得一篇航空动力设计的论文结果一波三折。
s/360的硬件设计由于节约了4个位,反而计算精度不及7090.
Gray的超级机器要想编写出程序,必须使用一些“范式”。
intel奔腾处理器浮点错误,intel使用查表法来进行浮点计算,工程师本以为很少用到的地方可以安全去除,结果事情的处理最终失控。
所以,实现IEEE浮点规范是很难的。
kahan说了一句意味深长的话:设计者往往把不得不做的事情说成是精心设计的结果。

 

数据通路:构造处理器
这部分很显作者的水平,从高度抽象的概念出发,暂时忽略细节来解决问题。
douglas e. comer也是这个方面的高手。
读书笔记_第2张图片

 

单周期设计
实现mips核心指令:load/store、add/sub、beq
先实现单个功能:通过组合线路。
再使用多路复用器将所有部件合成一体。
控制器的实现:时序线路。
根据操作码(对于R型指令,还要考虑功能码),对不同多路复用器施以不同信号,
这样整个数据通路就暂时成为实现 load/store、add/sub、beq中的某一特定指令的部件。
数据通路的执行在一个时钟周期内完成,如果需要更新寄存器、存储器,更新后的值需要下一clock cycle 可见。

 

多周期设计
单周期执行时间强制所有指令按最慢指令节奏执行,显然无法提供足够好的效率。
多周期方式可以改善这一点。
为了实现多周期,原有数据通路可以简化,指令、数据存储器合二为一,ALU和原有的两个加法器现在只使用一个ALU。
至于怎么实现多周期控制,解决地方法就是有限状态机。
有限状态机有着若干状态,根据输入信号,跳转到下一状态。
一个超市收银员就是一个有限状态机,没输入的时候保持休闲状态,有顾客进入工作状态,一个顾客结束后算完成一个周期。
再接收新的输入。

 

FSM
状态机的实现使用数字逻辑就可以实现。
处理器的另一处理方式就是将控制器的设计转化为软件编写。
使用EDA软件编写微码程序,编译,生成有限状态机。

 

exception
无论来自机器内部还是外部的控制流中任何意外的改变,mips中成为异常。
来自处理器外部的事件称之为中断。

 

未完待续...

 

 

二、迷宫与回溯总结

整理笔记本代码

 

三、数学阅读总结

微积分:从牛顿到勒贝格
牛顿之前已有积累,牛顿做出了关键一步:从特殊到一般的推广。
莱布尼茨原来是一位业余数学家,不过迅速学习而迎头赶上。

 

技巧高超的欧拉,尤其是无穷级数推导,鬼斧神功!
第一回合:不够严谨,例如无穷小量的处理,开始推导时这个量不等于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

你可能感兴趣的:(读书笔记)