说明:看完这节,不会让你称为汇编程序员,知识操作系统的前置。
ref:https://binhack.readthedocs.io/zh/latest/assembly/mips.html
https://www.bilibili.com/video/BV1w94y1a7i8/?p=7
MIPS
MIPS的意思是 “无内部互锁流水级的微处理器” (Microprocessor without interlocked piped stages)
RISC-Ⅴ:Instruction Set Architecure(ISA)
指令特点:
- 所有指令都是32位长
- 指令操作必须符合流水线,MIPS指令一次只能修改一个寄存器的值
- 3操作数指令
- 32个寄存器
- 没有条件标志位
寄存器
- MIPS下一共有32个通用寄存器
- 在汇编中,寄存器标志由 $ 符开头
- 寄存器表示可以有两种方式
- 直接使用该寄存器对应的编号,例如:从 $0 到 $31
- 使用对应的寄存器名称
- 例如: $t1 , $sp
- 栈的走向是从高地址到低地址
寄存器的编号以及其用途
name | 寄存器名称 | 寄存器用途 |
---|---|---|
zero | ||
ra | return Address | Return back into pc, addr isnot normally pushed onto the stack |
sp | stack pointer | stack grows downward |
tp | Thread pointer | Contains Core Number(i.e,“HartID”) |
gp | Global pointer | used by compliler |
a0~a7 | Function Args/Working Regs | 寄存器是用来作为函数的参数 |
t0~t7 | Temp/Working Regs | |
s0~s11 | Callee-Saved | if used,a function must:-save before use(on stack)-Restore before returning |
- Caller Saved 寄存器的值由调用者负责保存和恢复。保存方法通常是把寄存器的值压入堆栈中,调用者保存完成后,在被调用者(子函数)中就可以随意覆盖这些寄存器的值了。最典型的就是 ra (Return address)寄存器,用来保存返回地址(a 调用 b,b 的下一行就是返回地址,这个地址由 a 复制保存和恢复)。
- Callee Saved 寄存器的值由被调用函数负责保存和恢复。调用者就不必保存这些寄存器的值,直接进行子函数调用,子函数在覆盖这些寄存器之前,需要先保存这些寄存器的值,并在返回前恢复他们。
ref:https://pdos.csail.mit.edu/6.828/2020/readings/riscv-calling.pdf
因为寄存器没有状态位所以需要:
- 什么是用户态和内核态?两者有何区别?什么是中断和系统调用?两者有何区别?计算机在运行时,是如何确定当前处于用户态还是内核态的?
回答
在 RISC-V 中,有 3 种权限不同的模式(Machine mode、Supervisor mode、User mode)
machine mode 拥有所有的特权,一般在启动时候用于配置电脑的环境
supervisor mode 的权限相对低些,可以执行特权指令,例如是否使能中断等
user mode 的权限级别最低,完成一些特殊功能的时候需要通过系统调用进入 supervisor mode
内核态可以运行在 machine mode 和 supervisor mode 下,用户态只能运行在 user mode - 中断与系统调用
中断分为外中断和内中断,外中断包括 I/O 中断、时钟中断等,内中断包括异常、系统调用和中止
系统调用指的是处于用户态下的程序需要完成一些只有内核态才能完成的功能时,通过系统调用的方式进入内核态,从而实现功能的行为
主动调用,返回到下一条指令
一种中断,需要利用中断的机制来实现
在 RISC-V 中,通过寄存器 sstatus 中保存的 SPP 位来判断是处于内核态 (1) 还是用户态 (0)
timer interrupt
在计算机系统中,定时器中断(Timer Interrupt)是一种重要的机制,它允许计算机按照一定的时间间隔执行特定的任务。
基于硬件的Timer Interrupt是通过计算机系统中的定时器芯片来实现的。定时器芯片由硬件设计师将其集成在计算机主板上,通过预设定时器的数值和中断控制寄存器的设置,实现定时器中断的功能。
在xv6中 timer interrupt 时机器处于 machine mode!
马上,它会触发一个“software interrupt” 转到kernel model!