《CSAPP阅读笔记一》

《深入理解计算机系统》读书系列


第一章:计算机系统漫游

hello world 程序运行时,系统发生了什么。

程序由源文件开始,源文件由字节组成文本文件。文件分为ASCII表示的文本文件和二进制文件。

hello.c 经过预处理器(cpp)处理得到hello.i: 根据#开头的命令,将引入的程序插入
helloc.i 经过编译器(ccl)翻译成汇编程序hello.s: 不同高级语言对于汇编是相同的
hello.s 经过汇编器(as)翻译为机器语言指令hello.o: 二进制文件
hello.o 经过链接器(ld)链接标准C库的预编译目标文件产生hello: 可执行文件

GNU: GNU’s Not Unix

理解编译系统可以优化程序性能,理解链接时出现的错误,避免安全漏洞

shell是一种命令行解释器,第一个单词不是命令,就是可执行文件。

总线,I/O设备,主存,处理器

CPU:
程序计数器:指向某条机器语言指令
寄存器文件:小的存储设备

加载:主存->寄存器
存储:寄存器->主存
更新:寄存器->ALU->寄存器
I/O读,I/O写:寄存器<->I/O设备
转移:指令->程序计数器

执行hello程序

1
$ ./hello
  • shell程序逐一读取字符到寄存器,再把它存放在主存中
  • 敲回车键,shell结束命令输入,shell执行一些指令,将hello目标文件中的代码和数据从磁盘拷贝至主存,从而加载hello文件,数据:例如“hello world!\n”字符串
  • 利用DMA(直接存储器读取),数据不通过cpu直接从磁盘到主存
  • cpu执行hello程序机器语言指令,指令将“hello world!\n”的字节从存储器拷贝到寄存器,再从寄存器拷贝到显示设备。

高速缓存:速度位于寄存器和主存之间

操作系统:应用程序和硬件之间的一层软件,程序不直接访问键盘,显示器,磁盘或主存

  • 防止硬件被失控的应用程序滥用,
  • 为硬件做抽象表示:处理器->进程 主存->虚拟存储器 I/O设备->文件

进程:程序看上去好像在独占硬件
上下文切换:各进程指令的交错执行

虚拟地址空间
上1/4是操作系统数据与代码
从上至下:用户栈,共享库存储器映射区域。运行时堆,读写数据,只读的代码和数据

网络也是一种I/O设备

第二章:信息的表示与处理

信息存储中,8位称为一个字节,按字节寻址。

使用十六进制表示法表示字节(0x00-0xFF)
字长和虚拟空间地址大小的关系。

C声明 典型地32位机器 Compaq Alpha机器
char 1 1
short int 2 2
int 4 4
long int 4 8
char * 4 8
float 4 4
double 8 8

大端小端之争
字符串无大小端问题

sizeof(T)返回存储一个类型为T的对象所需要的字节数。

无符号,有符号,二进制补码

数字扩展和截断数字

无符号加法溢出
二进制补码加法溢出