处理器体系结构

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)输入的字符串长度越长,造成的破坏越大。可以用指向攻击代码的指针覆盖返回地址。
处理缓冲区溢出攻击:

  1. 编写代码时可以对边界进行检查
  2. 系统层级的保护:栈随机化
  3. 认证机制(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程序

  1. 将I/O设备输入的字符读入寄存器,再放入内存。
  2. 结束输入后,编译系统把.c文件转化为.o文件。并从磁盘复制到主存。
  3. 把指令复制到处理器后,开始执行机器代码。

cache:(高速缓存)

可移植性:使程序减少对数据类型的字节数的依赖性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值