深入理解计算机系统(一)

  • 计算机系统漫游👈
  • 信息的表示和处理👈
  • 程序的机器级表示👈

全书包括如下内容:

  • 计算机系统漫游👈
  • 程序结构和执行
    • 信息的表示和处理👈
    • 程序的机器级表示👈
    • 处理器体系结构
    • 优化程序性能
    • 存储器层次结构
  • 在系统上运行程序
    • 链接
    • 异常控制流
    • 虚拟存储器
  • 程序间的交互和通信
    • 系统级IO
    • 网络编程
    • 并发编程

计算机系统漫游

  1. 编译系统的组成:预处理器、编译器、汇编器、链接器
  2. 编译的过程:
  • 预处理阶段:hello.c–>hello.i
  • 编译阶段:hello.i–>hello.s
  • 汇编阶段:hello.s–>hello.o
  • 链接阶段:hello.o–>hello
  1. 什么是GNU:一个开源项目,是Linux操作系统的基石之一
  2. 什么是外壳(shell):命令行解释器,等待用户输入命令
  3. 系统的硬件组成:
    • 总线:四字节32位/八字节64位
    • I/O设备:用户输入输出
    • 主存:动态随机存取存储器DRAM,在32位机上short2字节,int/float/long四字节
    • 处理器:中央处理单元CPU,核心是程序计数器PC,PC指向指令地址,CPU执行:
      • 加载
      • 存储
      • 操作
      • 跳转
  4. 进程:是操作系统对一个正在运行的程序的抽象,进程并发运行依靠操作系统的上下文切换机制。在任意时刻,单处理器系统都只能执行一个进程的代码,在需要切换时就必须进行上下文切换。
  5. 线程:一个进程可以由多个线程组成
  6. 虚拟存储器:进程的虚拟存储器包括自己的和系统的,分为以下几类:
    • 程序代码和数据:只读的代码及数据以及读写数据
    • 堆:调用malloc和free等函数会改变堆的长度
    • 共享库:动态链接映射的地址段
    • 栈:用户栈,由编译器决定大小
    • 内核虚拟存储器:对用户屏蔽
  7. 文件:字节序列。
  8. 其他概念:
    • 并发与并行
    • 线程级并发–超线程
    • 指令级并行
    • 单指令多数据并行

信息的表示和处理

  1. 地址:存储器的每个字节都由一个唯一的数字来标识。
  2. 字:对于一个字长w位的机器,最大寻址范围为2^w-1,例如32位为4GB,w可以为8/16/32/64。
  3. C语言中数据类型及长度:
类型 32位 64位
char 1 1
short int 2 2
int 4 4
long int 4 8
long long int 8 8
char * 4 8
float 4 4
double 8 8
4. 寻址与字节顺序
  • 大端:最高有效字节在前(高字节在地址低位)
  • 小端:最低有效字节在前(低字节在地址低位)
  • 例如存储0x 01 23 45 67,最高字节为0x01,最低字节为0x67
  • 阅读小端的汇编内容时,地址从低到高从左到右,需要反转字节顺序才是真正的顺序,而大端模式与阅读顺序一致
地址 0x100 0x101 0x102 0x103
大端 01 23 45 67
小端 67 45 23 01
  1. sizeof()返回数据类型的字节数
  2. C语言的位运算:
    • |或运算OR
    • &与运算AND
    • ~按位取反NOT
    • ^异或:a^b^a = b,a^a = 0,0^b = b
  3. 掩码运算:对于0x89abcdef选取最低字节,则与掩码0xff进行与即可,更复杂点,如果只保留第8位,则选择掩码0x80即可
  4. C语言逻辑运算
    • ||逻辑或
    • &&逻辑与
    • !逻辑非
  5. C语言的移位运算
    • 左移:低位补0,高位舍去
    • 右移:
      • 算术右移:低位舍去,高位补最高位的值
      • 逻辑右移:低位舍去,高位补0
    • 移动位数很大,则先对字长取余,右移余数
    • 左移右移的优先级低于加减乘除
  6. 整数无符号数的编码
    (待补充)

程序的机器级表示–汇编

  1. 程序存储器:程序的可执行机器代码,操作系统信息,调用与返回的栈,用户分配的存储块(堆)
  2. 反汇编如何查看
    int accum = 0;
    int sum(int x, int y){
      int t = x + y;
      accum += t;
      return t;
    }
    gcc -O1 -c code.c
    objdump -d code.o
    
    code.o:     文件格式 elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <sum>:
       0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
       3:   01 05 00 00 00 00       add    %eax,0x0(%rip)        # 9 <sum+0x9>
       9:   c3                      retq
  3. 数据格式:Intel使用word表示16位双字节,双字表示32位数,四字表示64位数

本章主要内容位汇编语言的学习,不需要做笔记