知识回顾

冯·诺依曼体系结构

  • 只用北桥的话性能好,但需要集成封装,可扩展性差,且北桥造价高。
  • 只用南桥的话可扩展性好,造价更低,但是性能不够好。
  • 北桥更新换代更快。
  • 智能手机也符合冯·诺依曼体系结构。

结构特点

可编程、计算和存储分离

  1. 采用指令和数据存储在一起的结构
  2. 存储器是按地址访问、线性编址的空间
  3. 指令由操作码和地址码组成:MOV AX, 2
  4. 指令在CPU的运算单元处理
  5. 控制流由指令流产生

新的体系结构

背景:云原生和软件定义的出现。

  • 智能网卡:在网卡内进行计算
  • 存内计算:把CPU和内存进行整合
  • RDMA:远程直接数据存取,通过网络把资料直接传入计算机的存储区,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响

计算机指令

  • CPU是执行各种计算机指令的逻辑机器
  • 计算机指令也被称为机器语言,由一串0和1组成
  • 不同架构的CPU能听懂的语言不太一致,每种CPU均有其支持的计算机指令集
  • 指令执行的流程:硬盘→内存←→CPU

内存布局

  • BP(基址指针寄存器):与SS配合使用,指向栈底
  • SP(堆栈指针寄存器):与SS配合使用,指向栈顶
  • SI(源变址寄存器):存放相对于DS段的偏移量
  • IP(指令指针寄存器):与CS配合使用,跟踪程序的执行过程

8086 vs 80386

  • 8086:采用实模式(物理内存一一映射),直接左偏移,存在安全隐患,且寻址的范围较小
  • 80386:采用保护模式(引入虚拟内存),使用段选择子寄存器,较为安全,寻址范围较大

内存操作

函数调用

  1. 参数入栈:将参数从右向左依次压入系统栈中
  2. 返回地址入栈: 将当前代码区调用指令的下一条指令地址压入栈中, 供函数返回时继续执行
  3. 代码区跳转: 处理器从当前代码区跳转到被调用函数的入口处
  4. 栈帧调整
    (1)保存当前栈帧状态值,已备后面恢复本栈帧时使用:BP入栈
    (2)将当前栈帧切换到新栈帧:将SP值装入BP,更新栈帧底部
    (3)给新栈帧分配空间:把SP减去所需空间的大小,抬高栈顶

函数返回

  1. 保存返回值,将函数的返回值保存在寄存器AX
  2. 弹出当前帧,恢复上一个栈帧
    (1)将当前栈帧底部保存的前栈帧BP值弹入BP寄存器,恢复出上一个栈帧
    (2)将函数返回地址弹给IP寄存器
  3. 跳转:按照CS:IP跳回调用函数中继续执行

函数调用和返回实例

int static add(int a, int b){
0:   55                       push   rbp
1:   48 89 e5                 mov    rbp,rsp
4:   89 7d fc                 mov    DWORD PTR [rbp-0x4], edi
7:   89 75 f8                 mov    DWORD PTR [rbp-0x8], esi
a:   8b 55 fc                 mov    edx, DWORD PTR [rbp-0x4]
d:   8b 45 f8                 mov    eax, DWORD PTR [rbp-0x8]
10:   01 d0                   add    eax, edx
}
12:   5d                      pop    rbp        # 这里把红色的rbp赋值给rbp
13:   c3                      ret    0000000000000014 <main>:int main(){
14:   55                       push   rbp
15:   48 89 e5                 mov    rbp,rsp
18:   48 83 ec 10              sub    rsp,0x10  # 开辟栈空间
1c:   c7 45 fc 05 00 00 00     mov    DWORD PTR [rbp-0x4], 0x5
23:   c7 45 f8 0a 00 00 00     mov    DWORD PTR [rbp-0x8], 0xa
2a:   8b 55 f8                 mov    edx, DWORD PTR [rbp-0x8]
2d:   8b 45 fc                 mov    eax, DWORD PTR [rbp-0x4]
30:   89 d6                    mov    esi, edx
32:   89 c7                    mov    edi, eax  # 这四步看起来冗余,实际上提高了性能
34:   e8 c7 ff ff ff           call   0 <add>   # 函数声明必须在调用之前,否则不知道call哪里# 内存中看不出来函数返回值类型,因此只有函数返回值不同的不是函数重载
39:   89 45 f4                 mov    DWORD PTR [rbp-0xc], eax
3c:   b8 00 00 00 00           mov    eax,0x0
}
41:   c9                       leave
42:   c3                       ret

堆栈示意图

CPU执行指令流程

操作系统概述

操作系统的特征

  • 并发(Concurrence):同时存在多个运行的进程(多道程序), 需要OS管理和调度
  • 共享(Sharing)
    • 互斥共享: 某种资源(e.g., CPU)某时刻只能被一个进程独享
    • 同时访问: 允许在一段时间内由多个进程交替访问(e.g., 磁盘)
  • 虚拟(Virtual)
    • 利用多道程序设计技术, 让每个进程和每个用户觉得
    • 有一个处理器(CPU) 专门为他服务
  • 异步(Asynchronism):进程执行不是一贯到底, 而是走走停停且执行速度不可预知

操作系统的功能

  • 计算机系统资源的管理者
  • 用户与计算机硬件系统之间的接口

操作系统的分类

单道操作系统