IR(Instruction Register,指令寄存器)
什么是指令:
指令通常分为操作码和操作数,是一些01序列。
例如,当执行“a+b”这个操作时,操作码为"+";操作数为“a”"b"。在计算机系统中,操作码与操作数由二进制数值或十进制数值表示,例如,0001可能表示加操作,0010可能表示乘操作。
指令存储在指令寄存器(IR)中,IR通常有32位或64位,某一时刻IR中只有一条指令,表示当前正在执行该指令。
SP(Stack Pointer,堆栈指针寄存器)
堆栈是一个用于存储临时数据和函数调用信息的数据结构。SP 指向堆栈的当前顶部,当数据被推入或弹出堆栈时,SP 会相应地递减或递增。
用户态和内核态各自拥有独立的堆栈!
堆栈用途不同:用户态和内核态的代码具有不同的功能和用途。用户态堆栈主要用于用户程序的函数调用、局部变量和用户级别的堆栈帧。内核态堆栈则用于内核函数的调用和执行,其中包括系统调用处理、中断处理、异常处理等。这些不同的用途需要不同的堆栈来管理函数调用和局部数据。
PC(Program Counter,程序计数器):
概念:程序计数器通常有32位或64位,能表示2^32或2^64个内存地址,程序计数器某一时刻只能存储一个地址,该地址指向下一条将要执行的指令。
功能:是控制指令执行流程的关键,确保指令按照正确的顺序执行。
工作方式
顺序执行
在大多数情况下,当处理器按照程序的顺序执行指令时,PC 会自动递增,指向下一条指令的地址。这意味着处理器按照指令的顺序一个接一个地执行,不需要额外的干预。
分支和跳转指令
分支和跳转指令通常不需要切换到内核态。
当接受到 jmp 跳转指令时(该指令本身会包含新的地址信息,指令的操作码是jmp,操作数就是新的地址),PC不再按顺序执行,而是保存跳转指令中的地址信息,确保指令按照正确的顺序执行。
中断和异常指令
以下是一个中断指令的伪代码:INTERRUPT 0x10
操作码INTERRUPT表示该指令是一个中断指令;
操作数0x10表示处理器需要执行中断号为 0x10 的中断处理例程。
中断指令的操作数一般包含中断号或其他附加信息,以指示具体的中断类型或处理程序,具体的中断号和中断处理程序的地址将在中断向量表(IVT)中进行映射。
具体的流程:
当处理器遇到中断(interrupt)或异常(exception)时,
1、处理器暂停当前的执行流程,CPU切换到内核态(以下的所有操作都是在内核态下进行的)。
2、用户态的SP和PC 值保存到内核堆栈中,内核态下的操作都在内核栈上进行的。
3、根据中断指令的操作数跳转到一个与中断或异常相关的处理程序。处理程序的地址通常是预定义的,并且也存储在中断向量表中。
4、执行完内核态程序后,堆栈指针和程序计数器的值恢复到之前存储的用户态的SP和PC值。
5、内核执行返回指令(例如,RET或 IRET
指令),内核态切换为用户态。
函数调用和返回(这个作者也没太懂- -)
当函数被调用时,当前函数的返回地址(通常是下一条指令的地址)会被推入堆栈中,同时 SP 寄存器会递减以指向堆栈的新顶部。这样,函数的局部变量和状态可以在堆栈中存储。当函数返回时,SP 会递增,以弹出返回地址并恢复到调用函数的上下文,其中包括更新 PC 以继续执行下一条指令。
PSW(Program Status Word, 程序状态字)
PSW和SR的区别:
PSW 通常包含更广泛的状态信息,包括程序执行状态、特权级别、中断使能状态、程序计数器(PC)的值、堆栈指针(SP)的值等。它涵盖了与程序执行和控制相关的多个方面。
SR 通常包含与运算状态相关的标志位,如零标志、溢出标志、进位标志等。它主要用于存储最近一次运算结果的状态信息,以便在条件分支和逻辑判断中使用。
SR(Status Register,状态寄存器)
32bit,一般只使用6bit,分别存储:
Z(zero):一般情况下,程序出错时返回非零值。
V(overflow):是否溢出。
N(negative):是否为负值。
特权位(只有内核态可以修改):
I(Interrupt):是否为中断指令。
S(System mode):存储CPU处于用户态(0)还是内核态(1)。
P(Paging):分页(内存管理,后序会学)
共享内存,进程与线程
不同进程在同一时刻不能同时访问相同的地址空间,但共享内存技术可以实现这一点;
与之相对应的是,同一进程的不同线程可以在同一时刻访问相同的地址空间。
两种不同的虚拟方式: