处理器体系结构
ASCII标准:以单字节的整数来表示字符
文本文件:由ASCII字符构成(例如.c,.i,.s文件,其他都为二进制文件)
linux> gcc -Og -S 文件名.c
//-Og:符合原代码整体结构的优化等级
//-S:产生汇编代码
linux> gcc -Og -c 文件名.c
//-c:产生文件名.o文件
linux> gcc -Og -d 文件名.o
//-d:产生文件名.s文件
操作系统:位于应用程序和硬件之间的软件
- 文件:I/O设备
-
虚拟内存:主存和I/O设备
1.每个进程看到的内存一致
2.地址- 多字节对象的地址是所用字节最小的地址(32位int被存储在0x100至0x103 4个地址)
- 小端法:最低有效字节在最前面(intel,Android,IOS)
3.字节数组,每个字节都有唯一的地址。
4.虚拟地址空间所有可能地址集合
5.由不同的区域构成。(地址由小到大)- 程序代码和数据
- 堆
- 共享库
- 栈:
- 函数调用
- 栈底不变,向下生长(越下地址越小)
- 从栈顶插入或删除元素
- pushq Src:
- 从地址 Src 中取出操作数
- 把 %rsp(栈指针位于栈顶) 中的地址减去 8(向下移动)
- 把操作数写入到 %rsp 的新地址中
- popq Dest:
- 从 %rsp 中存储的地址中读入数据
- 把 %rsp 中的地址增加 8(向上移动)
- 把刚才取出来的值放到 Dest (必须是寄存器)中
- 内核虚拟内存
进程:CPU,主存和I/O设备。
1.并发运行:不同进程的指令交错进行,操作系统内核(管理进程的代码和数据结构的集合)进行上下文切换实现。多核处理器将多个CPU集成到1块芯片,每个CPU都有自己的L1L2高速缓存。
2.上下文:程序运行所需的状态信息
3.由多个线程组成虚拟机:对计算机的抽象
buffer overflow(缓存区溢出):参考虚拟地址空间,运行时栈有 8MB 的大小限制,一般用来保存局部变量。由于C对数组引用不进行边界检查,对越界数组元素的写操作会破坏栈中的状态信息。
void echo() {
char buf[4]; //为字符串分配的空间
gets(buf); //gets函数无法确定空间是否足够
puts(buf);
}
void call_echo() {
echo();
}
参考图3-40(CP196)输入的字符串长度越长,造成的破坏越大。可以用指向攻击代码的指针覆盖返回地址。
处理缓冲区溢出攻击:
- 编写代码时可以对边界进行检查
- 系统层级的保护:栈随机化
- 认证机制(Stack Canaries):在超出缓冲区的位置加一个特殊的值
主板:主印制电路板
控制器:I/O设备或主板的芯片组
适配器:主板插卡
I/O设备:通过控制器或适配器和I/O总线相连
主存:
缓存存储在容量较大,慢速磁盘的数据
- 执行程序时,存放程序和其需要处理的数据
- 由DRAM芯片组成。
CPU(*处理单元,处理器)
核心为大小为1个字的寄存器(程序计数器PC)。
Intel处理器俗称x86.x86-64是该处理器的机器语言。
- 通用目的寄存器CP120
- 16个存储64位
- 存储整数数据和指针
- 名字都以%r开头
- 条件码寄存器
- 描述算术或逻辑操作的属性,用于条件结构分支
- 除leaq指令外的其他指令都会隐式设置条件码
- CMP和TEST指令只根据结果设置条件码但不会改变参数的值
-
部分条件码:
- CF:无符号溢出
- ZF:结果为0
- SF:结果为负
- OF:补码溢出
-
功能:
- 存取数据:在内存和寄存器之间传输数据
- 计算:对寄存器或者内存中的数据执行算术运算
- 传输控制:非条件跳转和条件分支
-
性能CP361
- 延迟:运算所需的总时间
- 发射:连续相同类型的运算所需的间隔时间
- 容量:执行某运算的功能单元数量(最大吞吐量为其倒数)
吞吐量界限:原始计算能力
乱序:指令执行的顺序和机器级程序的顺序可能不一致
运行示意
- ICU(指令控制单元):从内存中读出指令序列
- 1条指令可被译成多个操作
- 退役单元:指令操作完成后且引起该指令的分支点预测正确后,可以退役该指令。
- EU(执行单元):执行操作
- 每个时钟周期会接收到多个操作,这些操作会被分配到一组功能单元执行实际的操作。
- 操作结果可以直接在功能单元之间传送。
- 条件分支如果预测错误,EU会丢弃分支点计算出的结果。
示例:helloworld程序
- 将I/O设备输入的字符读入寄存器,再放入内存。
- 结束输入后,编译系统把.c文件转化为.o文件。并从磁盘复制到主存。
- 把指令复制到处理器后,开始执行机器代码。
cache:(高速缓存)
可移植性:使程序减少对数据类型的字节数的依赖性
下一篇: 深入了解Java内存管理