zoukankan      html  css  js  c++  java
  • 读书笔记

    计算机组成与设计:硬件/软件接口
    课程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芯片

    性能评价:响应时间 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也是这个方面的高手。

    单周期设计
    实现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

  • 相关阅读:
    python 读写json文件(dump, load),以及对json格式的数据处理(dumps, loads)
    Postman + newman + jenkins 的API自动化测试应用
    Selenium + WebDriver 各浏览器驱动下载地址
    pythonon ddt数据驱动二(json, yaml 驱动)
    python ddt 实现数据驱动一
    Python + logging 输出到屏幕,将log日志写入文件
    python 多线程小练习
    pycharm + git 的集成使用
    Map的遍历方式
    69道Spring面试题和答案
  • 原文地址:https://www.cnblogs.com/servo/p/3420185.html
Copyright © 2011-2022 走看看