Background
- 程序会在记忆体与硬体中间搬移,但最後会在记忆体内执行,且在执行时会使用到register,才能到控制unit中做硬体的process。
- 记忆体只知道两种指令,且都是一连串的指令:
- address+read requests
- address+data and write requests ⇒ 但速度较慢
- Register存取一个指令,通常在一个CPU clock内或更少时间内完成。
- 记忆体管理比register存取高一个order;I/O device又比记忆体管理高一个order,所以在这之中存在着速度差的关系。
- 所有process在一个大的记忆体中执行,所以需要控制整个空间,但因为空间是共用的,所以需要保护自己的process,以免资源被别人拿去使用。
Base and Limit Registers(Hardware Support)
一个logic address space是由base和limit register所定义的。
- Base:process的起始位置。
- Limit register:process的大小。
CPU会负责以每个process ID来检查每个process是否有在自己的位置上。(between base and limit)
Address Binding
- 程序虽被储存在硬碟上,但须被载入记忆体中才能形成process去执行,而在硬体上等待的所有process会形成一个input queue。
- 一般来说记忆体的起始位置是0000,但使用者的位置却不一定,因为有可能已经被别人先使用了。
- 此外,address在程序生命周期的不同阶段以不同方式表示:
-
Source code addresses usually symbolic
-
Compiled code addresses bind to relocatable address
- Linker 或 Loader 将 relocatable address 绑定到 absolute addresses
Linker:将程序需要的像是一些library、code、proess等连接在一起。
Loader:将link好的程序,再load到确定的记忆体位置。
Binding of Instructions and Data to Memory
- Address在将指令与数据绑定到记忆体时,会发生三种不同的阶段:
-
Compile time:如果已经知道记忆体的位置,便产生 absolute code,但有更改位置的话,code也需要重新产生(recompile)。
-
Load time:如果程序在 Compile time 并不知道记忆体位置的话,就产生relocatable code。
-
Executin time:如果process在执行时,记忆体segment被搬移到另一个segment的话,连接就会延迟到这时才开始。
- 大部分作业系统都使用这个方法
- Need hardware support for address maps (e.g., base and limit registers)
Logical vs. Physical Address Space
- Logical address:由 CPU 产生。可说是当一个程序的最终位置未确定前的位置,也可称为「virtual address(虚拟地址)」。
- Physical address:真正记忆体的位置,由memory unit所看到。
compile-time和load-time address binding schemes,logical = physical address。
在execution-time address-binding scheme就不同了。
- Logical address space:Program 所产生的所有 logical address 的集合。
- Physical address space:这些逻辑地址对应的所有物理地址的集合。
Memory-Management Unit(MMU)
- 管理记忆体的硬体部分。
- Base register在实作中可以检查从logical address转移到physical address的动作,所以又称为relocation register。
- 使用者程序可以处理 logical address,它永远不会看到真正的 physical address。
- 当引用记忆体中的位置时,就会发生execution-time binding。
- logical address和physical addresses绑定在一起。
Dynamic relocation using a relocation register
- 当模组被呼叫时,才能将其载入主要记忆体中。(Routine is not loaded until it is called)
- 为了有更好的memory-space使用率,所以没有使用的routine将永不载入。
- 所有的routine以可重定位(relocatable)的加载格式,保存在硬碟上。
- 当大量的code被需要去处理不常发生的事件时,就会非常有用(e.g 错误常式)。
不需要操作系统的特殊支持 (和 MMU 没啥关系)
- 通过 program design 实现
- 操作系统可以通过提供 library 来帮助实现 dynamic loading
Dynamic Linking
- Static linking(静态连接):将 system libraries 载入 program code(由loader连结在一起),再由进入 binary program image。
- Dynamic Linking(动态连接):将 linking 延迟,直到执行时间。(并非"载入时发生")
- Stub 是 code 的一小片段,用於查找 memory-resident library routine。
- OS会检查是否routine在processes' space中。
- 动态连接对於libraries特别有用
- 此系统也可被称为shared libraries。
- 考虑是否适用於patching system libraries。