csapp 深入理解计算机系統 笔记

csapp 深入理解计算机系統 笔记

  • 参考
    • lab
  • 第1章:计算机系统漫游
  • 第 2 章:信息的表示和处理
    • Data Lab
  • 第03章:程序的机器级表示
    • Bomb Lab

参考

  • 计算机速成课 | Crash Course 字幕组 (全40集 2018-5-1 精校完成)
  • csapp重点解读
  • 深入理解计算机系統 csapp

lab

  • Lab Assignments
  • Lab 直接下载
  • 参考

第1章:计算机系统漫游

在这里插入图片描述
Amdahl定律: 当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度, 某一个部分占的时间百分比为 α \alpha α ,然后,把这一部分的性能提升 k 倍,系统性能提速的倍数为:
S = 1 ( 1 − α ) + α / k S=\frac{1}{(1-\alpha)+\alpha/k} S=(1α)+α/k1

第 2 章:信息的表示和处理

#include <stdio.h>
typedef unsigned char *pointer;void show_bytes(pointer start, size_t len){size_t i;for (i = 0; i < len; i++)printf("%p\t0x%.2x\n",start+i, start[i]);printf("\n");
}int main(){int a = 0x01234567;show_bytes((pointer) &a, sizeof(int));
}

输出:

gcc -g -O0 -o main main.c
./main
"小端表示:"
0x7fff82d76b84  0x67
0x7fff82d76b85  0x45
0x7fff82d76b86  0x23
0x7fff82d76b87  0x01

Data Lab

Data Lab: Manipulating Bits

wget http://csapp.cs.cmu.edu/3e/datalab-handout.tar
tar -xf datalab-handout.tar# 直接安装gcc-multilib 可能会报
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc: No such file or directory
# 安装对应版本的
sudo apt install -y gcc-9-multilib # 编译与测试
make
./btest -f bitXor

参考

/* 德摩根定律
(1) x^y = (~x&y)|(~y&x) = ~(~((~x&y)) & (~((~y&x)))
(2)x ^ y = (x | y) & ~(x & y)* bitXor - x^y using only ~ and & */
int bitXor(int x, int y) {// return (~(x & y)) & (~(~x & ~y));int a = ~(~x & y); //int b = ~((~y)&x);return ~(a&b);
}
// https://stackoverflow.com/questions/7300650/how-to-find-tmax-without-using-shifts
int isTmax(int x) {int a = ~((x + 1) ^ x); // 当是最大值是为0int b = !(x + 1); return !(a + b);
}
/* * allOddBits - return 1 if all odd-numbered bits in word set to 1*/
int allOddBits(int x) {int a1 = 0xAA;int a2 = (a1<<8) | a1;int a3 = (a2<<16) | a2;return !(a3^(x&a3));
}
/* * negate - return -x *   Legal ops: ! ~ & ^ | + << >>*/
int negate(int x) {return (~x)+1;
}
//3
/* * isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')*   Legal ops: ! ~ & ^ | + << >>*/
int isAsciiDigit(int x) {int a = !((x >> 3) ^ 0x06); // 判断 x>>3 是否为 110return a | (!(x ^ 0x38)) | (!(x ^ 0x39)); // 0x38 0x39 单独判断
}
/* * conditional - same as x ? y : z *   Legal ops: ! ~ & ^ | + << >> */
int conditional(int x, int y, int z) {int mask = ((!!x) << 31) >> 31; // x 为真是 0xffffffffreturn ((mask & y) | (~mask & z)) ; 
}
/* * isLessOrEqual - if x <= y  then return 1, else return 0 *   Legal ops: ! ~ & ^ | + << >>*/
int isLessOrEqual(int x, int y) {int sx = (x >> 31) & 0x1; // 获取最高符号位int sy = (y >> 31) & 0x1;int c1 = (~sy & sx);  //y正x负,直接可以判定y>xint c2 = (~sx & sy); //y负x正,直接可以判定y<xint y_x = y + (~x + 1); // y-xint sign = y_x >> 31; // 判断 y-x是否溢出return c1 | (!c2 & !sign); 
}
/* * logicalNeg - implement the ! operator*   Legal ops: ~ & ^ | + << >>*/
int logicalNeg(int x) {// 特殊情况 0x80000000 相反数是一样的int s1 = (x >> 31) & 1;int s2 = ((~x+1) >> 31) & 1;return (~(s1|s2))+2; // 所以不能使用 ^
}

第03章:程序的机器级表示

Bomb Lab

  • CSAPP | Lab2-Bomb Lab 深入解析
  • CSAPP实验之Bomb Lab详解
  • x86-64 下函数调用及栈帧原理
  • 【arm】常见函数调用约定(x86、x64、arm、arm64)

X64只有一种 fastcall 函数调用约定。
参数1、参数2、参数3、参数4分别保存在 RCX、RDX、R8D、R9D ,剩下的参数从右往左一次入栈,被调用者实现栈平衡,返回值存放在 RAX 中。

objdump -d ./bomb > bomb.asm
main 部分:400e32:	e8 67 06 00 00       	call   40149e <read_line>400e37:	48 89 c7             	mov    %rax,%rdi400e3a:	e8 a1 00 00 00       	call   400ee0 <phase_1>400e3f:	e8 80 07 00 00       	call   4015c4 <phase_defused>0000000000401338 <strings_not_equal>:401338:	41 54                	push   %r1240133a:	55                   	push   %rbp40133b:	53                   	push   %rbx40133c:	48 89 fb             	mov    %rdi,%rbx40133f:	48 89 f5             	mov    %rsi,%rbp401342:	e8 d4 ff ff ff       	call   40131b <string_length>401347:	41 89 c4             	mov    %eax,%r12d40134a:	48 89 ef             	mov    %rbp,%rdi40134d:	e8 c9 ff ff ff       	call   40131b <string_length>

调试

gdb ./bomb
(gdb) disassemble phase_1
Dump of assembler code for function phase_1:0x0000000000400ee0 <+0>:     sub    $0x8,%rsp0x0000000000400ee4 <+4>:     mov    $0x402400,%esi0x0000000000400ee9 <+9>:     call   0x401338 <strings_not_equal>0x0000000000400eee <+14>:    test   %eax,%eax0x0000000000400ef0 <+16>:    je     0x400ef7 <phase_1+23>0x0000000000400ef2 <+18>:    call   0x40143a <explode_bomb>0x0000000000400ef7 <+23>:    add    $0x8,%rsp0x0000000000400efb <+27>:    ret    
End of assembler dump.是将读入的%rdi 和 %rsi 进行对比x [Address expression]
x /[Format] [Address expression]
x /[Length][Format] [Address expression]
x
(gdb) x/s 0x402400
0x402400:       "Border relations with Canada have never been better."

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26906.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

讯为RK3568开发板到手编译buildroot系统入坑一

从事单片机开发多年一直想买一个开发板学习Linux系统&#xff0c;这次狠心花了800多打样买了一个讯为的RK3568低配。裸板配置。 因为讯为没有编译系统的视频教程&#xff0c;只有文档的教程&#xff0c;而且只有瑞芯微官方带的Linux源码中的系统编译后文档教程。像ubuntu是没有…

安装hive数据仓库

部署hive数据库 环境准备 需要安装部署完成的Hadoop的环境如果不会搭建的可以参考&#xff1a; 安装mysql 卸载Centos7自带的mariadb rpm -qa|grep mariadbrpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodepsrpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64是使用…

蓝牙耳机选购攻略:开放式耳机篇!如何选购开放式耳机?开放式蓝牙耳机哪些品牌比较好?过来人告诉你如何选购开放式耳机!

作为一个耳机爱好者&#xff0c;最近更是喜欢上了开放式蓝牙耳机&#xff0c;实际用过的起码有十几款&#xff0c;但其实最终能留下来的也只有四五款。由于前期并不知道应该如何选择开放式耳机&#xff0c;经常都会高价买到些质量差、音质也不好、漏音大的开放式耳机&#xff0…

关键点检测SIFT算法笔记

SIFT算法 SIFT&#xff08;Scale Invariant Feature Transform&#xff09;&#xff0c;尺度不变特征变换。具有旋转不变性、尺度不变性、亮度变化保持不变性&#xff0c;是一种非常稳定的局部特征。在目标检测和特征提取方向占据着重要的地位。 SIFT算法所查找到的关键点是一些…

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍

大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍 1.大语言模型的预训练 1.LLM预训练的基本概念 预训练属于迁移学习的范畴。现有的神经网络在进行训练时&#xff0c;一般基于反向传播&#xff08;Back Propagation&…

解决Gson解析json字符串,Integer变为Double类型的问题

直接上代码记录下。我代码里没有Gson包&#xff0c;用的是nacos对Gson的封装&#xff0c;只是包不同&#xff0c;方法都一样 import com.alibaba.nacos.shaded.com.google.common.reflect.TypeToken; import com.alibaba.nacos.shaded.com.google.gson.*;import java.util.Map;…

3.2 多路复用和多路分用

3.2 多路复用和多路分用 多路复用/分用分用如何工作&#xff1f;无连接分用面向连接的分用面向连接的分用&#xff1a;多线程Web服务器 多路复用/分用 分用如何工作&#xff1f; 主机接收到IP数据报(datagram) 每个数据报携带源IP地址、目的IP地址。每个数据报携带一个传输层的…

【使用深度学习的城市声音分类】使用从提取音频特征(频谱图)中提取的深度学习进行声音分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WPS/Office Excel 方向键无法切换表格

问题&#xff1a;WPS/Office Excel 方向键无法切换表格。 分析&#xff1a;键盘开启了Scroll Lock&#xff0c;导致Excel开启了滚动锁定。滚动锁定如图: 解决&#xff1a;再次按下Scroll Lock键解锁即可。&#xff08;Scroll Lock键在键盘右侧上方。&#xff09;

机器学习 day26(多标签分类,Adam算法,卷积层)

多标签分类 多标签分类&#xff1a;对于单个输入特征&#xff0c;输出多个不同的标签y多类分类&#xff1a;对于单个输入特征&#xff0c;输出单个标签y&#xff0c;但y的可能结果有多个 为多标签分类构建神经网络模型 我们可以构建三个不同的神经网络模型来分别预测三个不…

virtuoso culculator 绘制VCO 幅度频率曲线

virtuoso culculator 绘制VCO 幅度频率曲线 环境tran分析得到波形culculator编辑参数扫描 环境 IC618 TSMC65nm tran分析得到波形 culculator编辑 参数扫描 运行完后输出F-V曲线

怎么制作思维导图简单又漂亮?看看这几款常用模板

怎么制作思维导图简单又漂亮&#xff1f;制作思维导图可以帮助我们更好地梳理思路、整理信息。它可以让我们将复杂的信息变得易于理解和记忆&#xff0c;并且可以帮助我们更好地组织各种想法和概念。通过制作思维导图&#xff0c;我们可以更清晰地看到问题的本质&#xff0c;找…