CSAPP期末快速复习(更新ing)

本人有关CSAPP的博客链接:
私人博客
CSDN
内容基本上差不多

主要内容

  1. 概论
  2. 信息的表示
  3. 机器级的表示
  4. 链接
  5. I/O

概论

  1. 上下文:上下文是一个状态,包含运行进程所需的所有状态信息,进程切换通过切换上下文完成
  2. 编译过程(链接中会再次提到):源程序 预处理-> 文本 编译->汇编程序 汇编->可重定位目标文件 链接->可执行文件
  3. 指令集架构:每条机器代码的效果。微体系结构:处理器的具体实现
  4. 存储器层次结构:从上至下,访问速度越来越慢,容量越来越大。课本P10图。
  5. 操作系统:是应用程序和硬件之间的一层软件
  6. 操作系统的两个基本功能:防止硬件被失控的应用程序滥用;向应用程序提供简单的、一致的、有效的接口来控制硬件设备
  7. Amdahl定律:P16,了解即可
  8. 三个层次的并发:线程级别,指令级别(超标量处理器:在一个时钟单位内执行多个指令),单指令、多数据并行
  9. 三个层次的抽象:文件,虚拟内存,进程

练习:看一下P16练习1.1,不重要,了解即可

信息的表示

  1. 为什么使用二进制:便于表示、存储、传输
  2. 将学习的三种数据类型:有符号整数,无符号整数,浮点数
  3. 进制转换:略(数电里面学过了)
  4. 32位程序与64位程序的不同:32位程序long类型为4字节,指针类型为4字节;64位程序long类型为8字节,指针类型为8字节;寻址空间大小不同:32位程序最多寻址2322^{32}232即4G内存,64位能寻址2642^{64}264内存;64位机器向下兼容32位机器
  5. 大端法、小端法:大端法高位在内存低处,小端法低位在内存高处。直观表示为,小端法和平常的数字表示顺序是反过来的。
  6. 布尔环:a ^ a = 0,见课本第38页练习2.10。
  7. 逻辑运算与位运算的不同:逻辑计算只要得出了结果,就不会继续计算。例如a && b,只要a为假,则b不会执行。
  8. 移位运算:特殊的只有右移。逻辑位移补符号位,算术位移补0。
  9. 移位运算切记:移位的大小K绝对不能大于等于数据类型的字节数M,因为实际的移位大小为K mod M,例如int << 32,结果是32 mod 32 = 0,即不产生操作,应当更正为(int << 31) << 1
  10. 整数表示只需要记住:有符号整数与无符号整数仅仅只有解读方式不同,它们的位级表示是一样的,运算过程基本上也是一致的(乘法在底层使用的机器指令不一样,但是最终的位级表示是一样的)。
  11. 有符号整数的表示范围是不对称的-2^(k-1) ~ 2^(k-1)-1,例如int类型,范围为-2^31~2^31-1
  12. 有符号整数的负数形式采用补码表示。原因:其他的负数表达方式都有存在+0与-0的问题。
  13. 有符号整数的最小的负数表达形式的补码表示是自身。例如-INT_MIN=INT_MIN。至于为什么,写一下它的补码形式就知道了。所以它特别特殊。
  14. 无符号数与有符号数的快速转化k位的整数,无符号数=有符号数+2^k,例如,[1001]有符号数表示为-2^3+2^0=-7,无符号数表示为2^3+2^0=9,相差2^4=16
  15. 截断与扩展:截断就和取模差不多,扩展要注意是不是有符号数,因为有符号数的扩展要算上符号位。
  16. 乘法:P71
  17. 除法公式背:P74
  18. 加法溢出检测:如果加数均为正数,得出负数或者0,则说明溢出。不可使用c = a + b; c - b == a的方法进行判断:课本第65页练习题2.31
  19. 乘除法溢出检测:课本第68页2.35
  20. 浮点数的表示:P79
  21. 当将浮点数当成整数进行表示时,大小顺序不变:课本P81
  22. 浮点数所能准确表示的最大正整数:课本P83练习题
  23. 必须理解:P82最后一段话
  24. 向偶数舍入:若是中间值,向偶数舍入,否则向更近的那一边舍入。课本P84练习。
  25. 浮点运算:加法:可交换、单调性、不可结合(由于舍入,将丢失信息);乘法:可交换,单调性(整数乘法不具有单调性(溢出,正数相乘可能得到负数)),不可结合不具有加法分配性(1e20∗1e20−le20∗1e20=NaN1e20*1e20-le20*1e20=NaN1e20∗1e20−le20∗1e20=NaN(溢出)1e20∗(1e20−1e20)=0.01e20*(1e20-1e20)=0.01e20∗(1e20−1e20)=0.0)

机器级表示

A&T汇编

  • 寄存器
    寄存器分为三类(至少):被调用者保存寄存器,调用者保存寄存器,栈指针
    被调用者保存寄存器,即被调用的函数有义务使得这些寄存器的值在过程结束的时候保持和过程开始时候的值一样,即有义务保存这些寄存器的值。调用者保存寄存器,即调用者有义务自己保存这些寄存器的值。栈指针,即rsp指针,指向栈顶。具体看课本P120图

  • 寻址方式
    看课本P121表格并完成其后的练习

  • MOV族
    有MOV、MOVZ、MOVS三种类
    MOVZ:小->大。多出来的空间用0补足
    MOVS:小->大。多出来的空间用符号位补足
    注意:

  1. MOV的源和目的不能都是内存地址,至少有一个寄存器。
  2. movabsq是一个很特殊的指令,特殊在于会将寄存器的高位用0补足
  3. MOVS有movslq,而MOVZ没有movzlq,因为movabsq已经完成了该功能
  4. 特殊的指令:cltq,将eax扩展为rax,MOVS的指令
  • POP、PUSH
    POP和PUSH可以由其他指令复合完成。使用POP和PUSH指令的唯一目的是减少机器指令字节数。
    看P127页表
    注意,栈顶在低位地址。看课本P13图,注意观察箭头方向
    因此,分配空间要将rsp指针减去相应的大小。

  • 算术操作、逻辑操作
    看课本P129表
    注意,左移的两个表达式效果是一样的。
    注意下面一段话,leaq的灵活使用。

  • 条件码
    这个博客是基本介绍
    这个博客是详细一点的介绍

  • 跳转
    比较特殊的是jmp,有两种跳转方式,直接跳转和间接跳转。(在实践的时候发现,我好像只能对寄存器进行间接跳转。)看课本P139表

结构

过程

数据

链接

  1. 链接是将各种代码和数据片段收集组合成为一个单一文件的过程
  2. 链接可以执行于编译时,也可以执行于加载时,甚至运行于运行时。详见课本介绍
  3. 一个程序的编译包括:预处理,编译,汇编,链接。使用cpp进行预处理,使用cc1进行编译,使用as进行汇编,使用ld进行链接
  • cc1,第三个字符是阿拉伯字母1,而不是英文字母l
  1. shell会调用操作系统中一个叫做加载器的函数,将可执行文件的代码和数据复制到内存,然后将内核的控制权转交给该程序。
  2. 使用gcc -E进行预处理,使用gcc -S进行编译,使用gcc -c进行汇编,使用gcc -o进行可执行文件的生成
  3. 为了构造可执行文件,链接器必须完成两个主要任务:符号解析:将每个符号引用和符号定义关联起来;重定位:将每一个符号定义与内存位置关联起来,从而重定位section
  4. 链接器对整个程序一无所知,大部分工作都由产生目标文件的编译器与汇编器完成
  5. 目标文件分为:可重定位目标文件(.o),可执行目标文件,共享目标文件(.so)(关于.so文件,在gcc手册中有详细介绍)
  6. 目标文件的格式为ELF。参考资料1 参考资料2
  • ELF
  1. .text,正文,已经编译的机器代码
  2. .rodata,read only data
  3. .data,已经初始化的全局和静态变量(不包含局部变量)
  4. .bss,未初始化的全局和静态变量。该节不占据实际空间,仅仅是一个占位符。目标文件中未初始化的变量不需要占据空间,运行时在内存中将其赋值为0,也不占据可执行文件的空间。
  5. .symtable,符号表,存放函数、全局变量的信息。每个可重定位的目标文件都有一张符号表,除非使用STRIP命令去除。注意,其不包含局部变量
  6. .rel.text:一个.texg section中的位置列表。链接器会修改这些位置。任何外部函数或全局变量的位置都需要修改,任何本地函数的指令不需要修改可执行目标文件中不需要重定位信息
  7. .rel.data:所有的全局变量与外部定义函数的重定位信息。
  8. .debug:调试符号表,只有使用-g参数才会出现。条目中包含局部变量、全局变量、原始C文件
  9. .line:原始C文件与机器指令的行号的映射
  10. .strtab,字符串表

以上重要的有:1,2,3,4,5
可以使用readelf指令读取ELF文件

  • 符号
    链接器的上下文中有三种符号:
  1. 全局符号:能被其他模块引用的符号。对应于非静态的C函数与全局变量。在EFL文件中放在.data、.bss中
  2. 外部符号:由其他模块定义的全局符号
  3. 局部符号:不能被其他模块引用的局部符号,包括static属性的C函数与全局变量在该模块的任何位置可见!与局部变量区分!

链接器的符号和变量不是一个概念。.symtab中不包含任何局部变量(非静态)。这些局部变量(非静态)在栈中被管理。

定义为static的局部变量不是在栈中管理的,编译器在.data中为其分配空间,并创建一个有唯一名字的符号。
例如在两个函数中都定义了static变量x,那么编译器会创建两个符号:x.1x.2

  • 符号表
    有三个伪section,没有对应的条目:
    ABS:不应该被重定位的符号
    UNDEF:未定义符号
    COMMON:未分配位置的未初始化的数据(未初始化的全局变量)(.bss:未初始化的静态变量以及初始化为0的全局或静态变量)
    (未进行初始化的全局变量在COMMON中,未初始化的静态变量在.bss中)
    (完成课本P470练习)

  • 符号解析
    链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义关联起来。
    编译器值允许每个模块中每个局部符号有一个定义,还要确保静态局部变量有唯一的名字。
    编译器遇到一个不在当前模块中定义的符号时,会假设该符号时在其他某个模块中定义的,然后生成一个链接器符号表条目,将其交与链接器处理。
    多个目标文件可能会定义相同名字的全局符号。链接器要么标志为错误,要么以某种方式选出一个定义并抛弃其他定义。(C++中的重载)

  • 解析全局符号
    只有全局符号才有强弱的概念
    函数和已初始化的全局变量是强符号,未初始化的全局变量是弱符号
    使用以下规则处理多重定义的符号:

  1. 不允许同名的强符号
  2. 强符号和弱符号同名,选择强符号
  3. 多个弱符号,随机选择
    规则2和规则3的连续应用会造成一些运行时错误

使用gcc -fno-common调用链接器,告诉链接器,在遇到多个全局符号的时候,触发一个错误

  • 与静态库链接
    标准C函数放在了一个单独的、可重定位的目标模块中,优点是可以将编译器的实现与标准函数的实现分离,缺点是每个可执行文件都包含着一个标准函数集合的完全副本(极大浪费了磁盘空间),并且每个程序都将自己的函数的副本放在内存中(极大地浪费了内存空间)。
    静态库的概念用于解决上述缺点
    相关函数被编译为单独的模块,然后封装为单独的静态库文件。链接时,链接器只复制被程序引用的目标模块

使用AR工具创建一个静态库:
ar rcs lib.a a.o b.o

  • 静态库解析引用的流程
    在符号解析阶段,链接器从左到右扫描命令行上的可重定位目标文件与archive文件
    它维护着一个可重定位目标文件的集合E一个未解析符号集合U,以及已定义符号集合D
    解析流程:
解析文件f->目标文件-> add f to E, edit U and D-> next file->archive file-> 如果成员文件m定义了U中的一个引用-> add m to E, edit U and D-> next file

上述流程的缺点:能否成功解析与出现在命令行上的顺序密切相关。
原则:将库文件放在后面。
(在An introducuction to GCC一书中有详细描述)

I/O

CSAPP期末复习(更新ing)相关推荐

  1. 二元函数对xy同时求导_更新丨10分钟掌握高等数学上册函数极限求解问题(考研、期末复习均可以用)...

    学过高数的都知道,极限在高数的应用频率是非常高的,而且是很多高数知识的基础,求导.变限积分求极限.多重积分求极限等等均会用到 虽然是基础,但是很多人在刚学习的时候就会直接被理论弄懵圈,因此就无法继续再 ...

  2. 【期末复习】转眼到了C++的复习时间(更新中)

    时间过的很快.似乎昨天才刚刚开学,转眼间已经到了期末复习的时间了.距离C++期末考试还有一个月的时间,我正式开始了C++的复习计划,以期让我在后期可以更加从容.淡定,能够拥有更多的时间去投入到自己想去 ...

  3. 信号与通信系统【期末复习提纲·绪论】

    <信号与通信系统>期末复习提纲(更新ing~~) ~~以下均为绪论考点(个人理解,仅供参考)~~ 考点1:平均信息量的计算 注意区分等概率和不等概率的情况,不等概率须累加求和(信息量*对应 ...

  4. 2020年通信网络基础期末复习

    文章目录 期末考试(已删除!) 平时作业题汇总 写在最后 写在前面: 第一,现在是2021年6月28日19点46分,之前的文章需要填坑!男人嘛,言而有信. 第二,写这篇文章之日,距离考试接近一载光阴, ...

  5. 通信网络基础期末复习与汇总

    计算机网络课程 期末复习汇总,方便自己复习总结. [1]通信网络基础期末复习-第一章和第二章-概论和端到端的传输协议 [2]通信网络基础期末复习-第三章-网络的时延分析 [3]通信网络基础期末复习-第 ...

  6. 通信网络基础期末复习-第五章-路由算法

    写在前面:本文主要依据为<通信网络基础>李建东,盛敏编著,如有侵权,请联系作者删除.本文仅用于个人期末复习与知识结构的搭建. 文章目录 第五章 路由算法 5.1 路由算法概述 5.1.1路 ...

  7. 计算机期末考试知识,干货|计算机期末复习宝典

    原标题:干货|计算机期末复习宝典 时间过得真快 再有几天就又到计算机期末考试时间啦 计算机已经学了一学期 可小编听说面对access 很多人还是一脸懵 完全不知道该怎么办 不过不用担心 商院君已帮你将 ...

  8. 金融学期末复习重点准备

    金融学期末复习重点准备 前言 记一下金融学期末复习重点准备. 主要是把重点点到,刨去了铺垫和逻辑. 我好像想明白为什么我写<<管理学>期末第一次复习>的时候总感觉怪怪的. 我应 ...

  9. 【笔记总结】计算机系期末复习、专业课学习、算法与其他笔记

    2022.4.18 整理了一下自己写的乱七八糟的博客. 2022.6.12整理了一些大二下的期末复习. 2022.7.22更新Java学习笔记. 2022.8.30更新LeetCode笔记. 2022 ...

最新文章

  1. pyspark 读取本txt 构建RDD
  2. tomcat 反代配置
  3. 转载:CSS垂直居中总结
  4. 俄罗斯方块之四 运动块的绘制实现
  5. stack overflow at line
  6. 安装elasticsearch-php,安装 |《Elasticsearch-PHP 中文文档 6.0》| PHP 技术论坛
  7. 关于excel中的查找
  8. fullgc频繁的原因_系统运行缓慢,CPU 100%,Full GC次数过多,这一招帮你全搞定
  9. bzoj1180: [CROATIAN2009]OTOCI
  10. 漫谈边缘计算(四):赢家是软还是硬
  11. JAVA程序员一定知道的优秀第三方库(2016版)
  12. Java匹马行天下之学编程的起点——编程常识知多少
  13. Hibernate的CRUD
  14. matlab二次求导函数,原来可以这样求导函数,再复杂的函数求导不再话下!
  15. ucore Lab1 系统软件启动过程
  16. log以2为底的对数
  17. 计算机中常用术语CAD是指,计算机常用术语CAD的含义是
  18. “机器学习实战”刻意练习——分类问题:决策树
  19. mybatis-sql语句莫名其妙被加上limit分页条件或未执行查询条件
  20. vs2017 - vs2012

热门文章

  1. Win10 环境下配置 Docker + Laradock + Laravel
  2. JavaScript 获取一元素的所有子元素
  3. 第九章 使用结构体类型处理组合数据——用户自定义数据类型
  4. android系统测试接口开发,Android开发者如何模拟接口获得自己想要的数据进行测试?...
  5. java浏览器无界面后台截屏工具
  6. nck课程笔记:破解补丁工具的使用
  7. 什么是面包屑导航,它对SEO的影响有哪些?
  8. 面试官:你知道Dubbo怎么做优雅上下线的吗?你:优雅上下线是啥?
  9. python语句--条件语句
  10. java多线程之Callable接口