MIPS 处理器设计笔记:编译流程与运行逻辑
Why MIPS?
学校的课程设计需要做一个 MIPS 的五级流水线单周期处理器,这是 项目链接。
MIPS 有一个特点,那就是延迟槽。如果在编译参数中将延迟槽关掉,那么每一个分支指令后面的延迟槽就会变成空指令,这为流水线的指令相关解决提供了便利。
这个项目提供了简单的测试环境,但是遗憾的是由于时间有限,并没有提供 difftest。
程序编译流程
- mips 交叉编译工具链编译成目标文件;
- 将目标文件的 .data 抽取到 dataMem 中,将.text 抽取到 instMem 中,这个过程自动化的;
- 通过链接脚本控制编译的数据段、程序段虚拟地址(CPU 发出的地址),以便正确访存;
- 可以将目标文件反汇编成 .txt 文件,利于读取查看;
- 就可以放到 vivado 中进行下板验证了;

程序运行逻辑
- 首先是_start,设置一个 sp,由于 instMem 是 reg [31:0] mem [0:1023],大小为 4KB,因此 sp 设置为 4KB;
- 跳转到 _trm_init,这是一个监视 main 函数是否成功执行的环境,它调用 main 函数;
- main 函数就是各种测试了,比如 add.c sub.c 等等;

让 MIPS 跑一个简单的 OS?
这个 OS 来源于 ysyx 项目的 yieldOS。功能是切换上下文。
原理很简单,只需要设置一个上下文结构体,A 进程调用yield(),yield() 是一个内联汇编:
1 | |
MIPS 执行到 syscall 指令的时候,就会跳转到 __am_asm_trap:
1 | |
保存上下文之后,调用调度函数,该函数返回一个新的上下文:
1 | |
之后,将这个上下文中的关键寄存器中的值,恢复到现场,然后 eret,返回到上次打断的地方,就可以继续运行了。
这个简单的 OS 和其它 OS 的上下文基本一致,区别无非就是CPU 结构的区别了。
MIPS 处理器设计笔记:编译流程与运行逻辑
http://blog.luliang.online/2025/03/10/mips-processor-design/