重定位
基地址base放在PCB中
PC IR等的概念
二次整理
因为程序是放在内存中的,当开始取指执行的时候,内存就用起来了。
PC指向开始地址可以让程序开始执行起来。
需要用磁盘(因为程序编译完是放在磁盘上)将程序读入到内存,接下来的问题是读到内存哪里?
因为将程序放入内存需要放到空闲区域,所以这就涉及到了重定位。
程序中的地址不一定能放在物理内存的对应地址,所以这就需要我们来重定位,将其看成相对地址(因为最后一定是要放在物理内存中才能执行的)。
载入和编译的时候重定位的优缺点,call 40
中的40是逻辑地址,也就是说是假的地址。
相比编译时候重定位,载入时候重定位更灵活一些,但是载入后就不能移动了,还是不行。因为程序载入后还要移动,因为多进程之间要换入换出(内存有限,进程睡眠时候要换出,其他进程换入)。
一旦程序执行起来后,就有了PCB,然后PCB中就有了基地址base
。
内存换入换出也就相当于内存释放。
创建进程后,就会同时创建PCB,然后找一块空闲的内存,将该内存的基地址(初始地址)放到PCB中,然后把程序放到这块空闲内存中。
每次执行指令都要进行地址翻译(也就是运行时重定位),通过翻译找到实际使用的物理内存地址。
基地址放到基址寄存器中。
通过基地址找到实际的地址。
切换是switch_to()
函数。
PC程序计数器
CPU中的主要寄存器
想想进程是如何连带内存的?
程序要分段(对于程序员来说)
分段的作用——
因为程序有主程序段,它是只读的;
有变量段,它是可写的;
有函数库,它是可动态链接的;
有栈,它是单向增长的。
每个段都有自己的特点,所以分段也是分治。
分了段,段不同,就要考虑不同的段基址
。
每一个进程都有一个进程段表。
OS的进程段表就是GDT
表,其他进程的段表就是LDT
表。
jmpi 0, 8
就是访问段表。
进程切换的时候,LDT表要跟着切换。
在段表的基础上使用内存。