
计算机系统基础-学习记录
文章平均质量分 84
此专栏包含武汉大学2020-2021学年第一学期蔡朝晖老师《计算机系统基础1》的上课笔记,内容主要包括数据的基本表示,汇编基础,代码优化,链接和异常控制流
十万行出头天
那一日,咱可以出头天
展开
-
计算机系统基础-学习记录18-网络程序(2)
网络程序(2)——网络连接的程序实现 有了前面提到的概念,就可以开始根据客户-服务器模型,逐步进行网络连接程序的编写了。利用C语言编写的网络程序,大致流程如下图所示: 对于客户(左侧的Client)而言,首先需要获取自身的地址信息(getaddrinfo),随后利用这个信息创建一个socket地址(socket),接下来就进入了连接服务器的阶段(connect);而对于服务器(右侧的Server)而言,一开始也是获取自身的地址信息(getaddrinfo)以及创建一个socket地址(socke原创 2021-04-22 15:04:01 · 276 阅读 · 0 评论 -
计算机系统基础-学习记录17-网络程序(1)
网络程序(1)——网络基础 通过网络进行信息的传输,实际上就是不同进程间的信息交互。所有的网络应用,都是基于一个叫做Client-Server(客户-服务器)的模型开发的Client-Server(客户-服务器)模型 在Client-Server模型中,一个应用程序由一个服务器(Server)进程和多个客户(Client)进程(后面会称作host)组成。服务器进程会根据客户进程的请求,对相应的资源进行操作,并将相应的反馈传回给客户,如下图所示:网络 从硬件上来看,网络可以看做是和USB控原创 2021-04-17 15:24:37 · 220 阅读 · 0 评论 -
计算机系统基础-学习记录16-系统级I/O
系统级I/O I/O,即input/output,是指主存与外部设备之间的数据交互。在高级语言中使用的输入输出函数(例如,C语言中的printf和scanf),被归类为高级别的I/O(higher-level I/O)函数,而这些操作其实是由系统级的I/O(system-level I/O)函数组成的。理解了系统级I/O,便能更加容易地去理解高层I/O的工作原理文件 诸如网络、磁盘以及终端等一切I/O设备,均被称作“文件”文件的基本操作 对于文件而言,都具有以下的四个基本操作:1、打开文件原创 2021-04-13 23:00:06 · 176 阅读 · 0 评论 -
“你说被火烧过,才能出现凤凰”——《计算机系统基础 1|csapp 1》课程结课感言
“你说被火烧过,才能出现凤凰”——《计算机系统基础 1|csapp 1》课程结课感言 距离本科阶段的最后一门考试:csapp 1的出分,也已经过了一周多了。鸽了这么久,也是时候在这里简单地回顾一下这本科的最后一门课程了。 开学选课的时候,因为计组这门课不在这学期,又听说操作系统那门课需要建立在计算机系统基础等一系列的内容之上,所以最后的选择也就只剩下了《计算机系统基础》这门课。In fact,那时候,还不知道这门课就是csapp(其实也不知道csapp是啥),只是觉得和计组有一定的关联才去选的(毕原创 2021-01-28 19:33:57 · 250 阅读 · 0 评论 -
计算机系统基础-学习记录15【课程完结】
异常控制流(续)并发编程中出现的问题 并发编程中,非常难找到错误。在debug时,即便是一步步地运行,也很难找到错误,而在实际运行时却会出现不少的见不到的问题 deletejob:删除任务。shell创建了前台任务,在这个地方创建子进程。为了管理子进程,会建立一张全局的表(进程表,任务表)。在这张表中,每创建一个任务,就会将相关的信息填到表中(例如进程id号等)。当有一个进程退出时,就要回收一个进程,将表中相应的进程表项删除掉(delete the child from the job list)原创 2020-12-26 20:06:47 · 119 阅读 · 0 评论 -
计算机系统基础-学习记录14
异常控制流(续)上下文切换上下文 维持进程需要给一定的环境,这个环境叫做上下文 环境是由内核(操作系统)维持的 上下文主要包含:程序代码、数据、PC计数器的值(程序计数器,永远指向下一条要执行的指令)、寄存器文件(寄存器组,保存了参加运算的数、中间/最后运算结果)、状态寄存器(包含的是某一时刻CPU所处的状态)、用户栈、内核栈、环境变量、内核的数据结构、进程表(常驻内存)、页表(每个进程都有自己的页表,进程创建时出现页表,进程结束后页表消失,因此也是常驻内存的)、文件表上下文切换 进程原创 2020-12-20 16:01:53 · 237 阅读 · 0 评论 -
计算机系统基础-学习记录13
操作系统简介(续) 操作系统的作用:隔开上层应用和底层 操作系统实质上就是程序,是用户程序和计算机之间的中介 操作系统主要有三部分: 1、进程 2、虚拟存储器:对存储系统进行管理,虚拟地址就在这里实现。虚拟存储器不是硬件,而是硬件和软件结合的部分,由硬盘、主存和操作系统的一部分代码构成 3、文件系统:所有内容都是以文件的形式存储,由文件系统进行文件管理 MMU:对(存储器)系统进行管理进程 进程:运行起来的程序 打开任务管理器时,可以看到很多进程,其中很多进程是由操作系原创 2020-12-12 12:56:32 · 182 阅读 · 0 评论 -
[csapp]buflab(educoder版)作答记录
一、实验目的 利用字符输入,对程序的栈进行攻击,破坏栈的结构,从而起到“攻击”的效果。通过这样的练习,来加强对程序栈的理解,以及在执行leave、ret、nop等语句时,寄存器%rbp,%rsp,%rip的变化。二、实验过程 本次实验使用的操作系统为Ubuntu 20.04。预先准备 从官网上下载buflab-handout,里面有三个程序文件:bufbomb、hex2raw和makecookie。 bufbomb便是本次实验将要被攻击的程序了。因为要做的是educoder上的训练(ed原创 2020-12-03 21:05:01 · 596 阅读 · 0 评论 -
计算机系统基础-学习记录12
链接(续)静态链接(续) 静态链接将公用库单独形成一个库文件。库文件共有两种:静态库文件和动态库文件,正式这两种不同类型的库文件,导致了链接方式也有两种:静态链接和动态链接 Linux系统下的静态库文件,后缀名为.a,属于二进制序列化文件,链接时会在在里面找到函数的定义 静态链接和动态链接的区分:静态链接是在库里面找到想要找的代码,并将代码和数据拷贝到可执行目标文件里面 在(静态)链接解析的时候,就会根据符号表没有找到定义的,到库里面去找。找到了的,就会拷贝到目标文件中,将代码和数据都拿过原创 2020-12-03 20:21:32 · 275 阅读 · 0 评论 -
计算机系统基础-学习记录11
链接(续) 上回提到,链接器linker主要做的有两件事:符号解析和重定位。其中符号解析已经详细提及,接下来是重定位重定位 重定位:重新赋予运行的地址 重定位的目标:将多个重定位文件融合在一起(代码与代码,数据与数据),给一个融合后的运行地址的值 两步操作: 1、对节和符号进行重新定位 2、重定位节中的符号引用 在重定位后进行融合,以生成可执行目标文件。融合结束后,每一个引用的位置都发生了变化。因此,此时应该找到新的地方的地址。由汇编器产生重定位的索引重定位条目 ELF重原创 2020-11-28 15:38:43 · 456 阅读 · 0 评论 -
计算机系统基础-学习记录10
链接 这次讲的和官网的顺序及内容不太一样,暂时也还没有课件用于参考,所以只能直接发现场记的笔记了 重定位目标文件,合二为一,变为一个程序 打包:使用setup.exe安装 动态库(动态链接):*.dll,在装载(load)时链接 三种链接情况在程序运行中都会出现 科研使用Linux的原因:只有Linux开源 ide集成了链接过程 临时变量会临时给一个寄存器,而全局变量则会保存在字段中,在链接时只关注全局变量 编译时链接:静态链接 运行时链接:动态链接 目标文件的地原创 2020-11-22 15:21:18 · 211 阅读 · 0 评论 -
计算机系统基础-学习记录9
程序优化指令集并行(续) 当代CPU的设计大致如下图所示: 可以看出,这里面有很多部件。在程序运行时,不同功能的部件可以不必严格按照程序的先后顺序来运行,他们在条件合适的情况下,是可以并行运行的。值得注意的是,这里的“并行”,并不是并行编程,而是利用处理器的独立单元并行运行 以Haswell CPU为例,它有2个load部件,1个store部件,4个integer部件,2个浮点乘法部件,1个浮点加法部件和1个浮点除法部件 Haswell CPU对各指令的延迟以及发射周期如下表所示:原创 2020-11-14 20:58:46 · 517 阅读 · 0 评论 -
[csapp]bomblab-handout作答记录
源自《bomblab-handout实验报告》一、实验目的 通过练习,加深对汇编语句的理解,熟练断点调试工具(此处为gdb)的使用。二、题目分析准备工作 阅读说明,打开文件夹,看到bomb文件。 对bomb文件使用objdump -d bomb > bomb.asm,即可将源文件bomb进行反汇编,并将反汇编的结果放入bomb.asm文件中。objdump在Ubuntu系统上是自带的,无需使用apt-get install安装。双击bomb.asm,就能看到汇编码,将其拖拽至窗口右侧原创 2020-11-12 16:35:20 · 520 阅读 · 1 评论 -
计算机系统基础-学习记录8
程序优化 为了提高程序的性能,必须要在算法、数据表示、过程和循环这四个层面上进行优化。常用优化方法不重复计算常数 例如,下述代码:void set_row(double *a, double *b, long i, long n){ long j; for (j = 0; j < n; j++) a[n*i+j] = b[j];} 在for循环中,每一次循环都进行了一次n*i的计算,这显然是不必要的,可以通过在进入for循环之前就算好n*i的方式进行优原创 2020-11-07 17:00:22 · 243 阅读 · 0 评论 -
计算机系统基础-学习记录7
程序的机器级表示:特殊数据结构(续)结构(Structures)结构的表示 在C语言中,结构用struct定义,例如:struct rec { int a[4]; size_t i; struct rec *next;}; 表示定义了一个结构体rec,其中包含了成员int数组、占8字节的size_t类型和指针 结构占用的是一块空间,这块空间足以放下所有的成员结构的对齐 按平常的理解,结构中的成员在地址上应该是连续的、紧密相接排列的。例如:struct S原创 2020-10-31 16:06:07 · 175 阅读 · 0 评论 -
计算机系统基础-学习记录6
程序的机器级表示:过程(续)寄存器存储惯例 调用者保存暂存的值在调用者的帧内被调用者保存暂存的值在被调用者的帧内 对于调用者而言: %rax用于保存返回值 六个寄存器%rdi,%rsi,%rdx,%rcx,%r8,%r9用于保存参数 超过6个参数后,多出的参数将会通过栈进行传递 调用者需要保存%r10和%r11两个寄存器,之后会用到 对于被调用者而言: 被调用者保存4个寄存器:%rbx,%r12,%r13,%r14 被调用者也保存%rbp(帧指针)(返回时返还)、%r原创 2020-10-25 21:18:06 · 1301 阅读 · 0 评论 -
[csapp]datalab作答记录
datalab-handout作答记录简要说明 文件是从官网(http://csapp.cs.cmu.edu/3e/labs.html)下的,看起来题目好像和网上大多数讨论的不一样,不过应该是大同小异,问题不大。 这样的训练的主要目的是加深对系统的各种理解。因为感觉如果直接写完就扔掉不管的话,就会很快就忘记各种思路,使得训练达不到应有的效果,所以决定在优快云上记录自己的思路,以加深印象,同时,如果可能的话,也希望能给后来人提供一些思路上的指引。1、按位异或的实现 规则:只使用~和&原创 2020-10-22 19:17:12 · 884 阅读 · 0 评论 -
计算机系统基础-学习记录5
程序的机器级表示:控制(续)条件分支指令(续)条件分支表达式的变量不能是一样的,例如val = x >0 ? x*= 7 : x+=3;会先计算两个分支的x值并更新,导致结果不对条件分支指令的举例:有如下C语言指令:long absdiff(long x, long y){ long result; if (x > y) result = x-y; else result = y-x; return result;}原创 2020-10-20 21:41:16 · 722 阅读 · 0 评论 -
计算机系统基础-学习记录4
程序的机器级表示:基础(续)汇编基础(续)将C语言转换为目标代码(机器语言)(续) 高级语言通过编译器,变为汇编语言或机器语言。汇编语言通过汇编器变成机器语言。最后经过链接器,形成最后的exe文件 链接分为静态链接和动态链接: 静态链接:直接拷贝代码 动态链接:动态执行 Windows: 静态库:*.lib 动态库:*.dll Linux: 静态库:*.a 动态库:*.so gcc编译器采用ATT标准的Intel汇编格式。不同的编译器可能会导致汇编语言不同数原创 2020-10-12 22:30:01 · 403 阅读 · 0 评论 -
计算机系统基础-学习记录3
浮点数(续)舍入、加、乘运算舍入运算舍入方式1、向零舍入。例如:-2.1舍入到-2,3.4舍入到32、向下(负无穷)舍入3、向上(正无穷)舍入4、向偶数舍入(向离自己最近的整数舍入,靠两个整数的中间时,向偶数舍入)经过证明可以得到,向偶数舍入的方式误差最小,因此采用此种方式二进制的舍入在二进制的舍入中,如果将要被舍去的首位达到了1,则表明需要舍去的那一部分的值正好达到了所需要精确到的最末位的权重的一半。而舍入后的最后一位总是0,因为这样才能保证舍入到了偶数,如图1所示:图1加法运算原创 2020-10-04 18:14:20 · 306 阅读 · 0 评论 -
计算机系统基础-学习记录2
乘法运算范围:对于无符号型:0≤x∗y≤(2w−1)2=22w−2w+1+10\le x*y\le (2^w-1)^2=2^{2w}-2^{w+1}+10≤x∗y≤(2w−1)2=22w−2w+1+1,最高位能到2w位(22w2^{2w}22w会排到2w+1位,但减去的2w+1−1≥12^{w+1}-1\ge 12w+1−1≥1,所以最多能排到2w位)对于二补数的最小乘积:x∗y≥(−2w−1)∗(2w−1−1)=−22w−2+2w−1x*y\ge(-2^{w-1})*(2^{w-1}-1)=-2^{原创 2020-09-26 20:12:58 · 214 阅读 · 0 评论 -
计算机系统基础-学习记录1
比特(bit),字节及整数使用bit表示信息所有的bit都是0或1的使用bit的原因:电路易于存储双稳态的元素——低压表示0,高压表示1二进制表示法格式:数字+下标2,例如:11101101101101211101101101101_2111011011011012字节(byte)1字节=8 bits在二进制上,从000000002_22到111111112_22在十进制上,从010_{10}10到25510_{10}10在十六进制上,从0016_{16}16到FF16_{1原创 2020-09-20 21:14:27 · 612 阅读 · 0 评论