RRAM 队
南京大学 PA 实验的 LoongArch 支持。通过构建一个简单完整的计算机系统,来深入理解程序如何在计算机上运行。
PA 实验从 ISA 模拟器实现开始,逐步到运行时库函数和真实应用程序,构建从下到上逐步抽象的完整计算机系统。当前 PA 实验缺少对 LoongArch 的实验指导和调试工具,需要对 LoongArch 进行移植适配。对PA实验的loongarch的补充文档已经提交PR
- nemu:底层虚拟机,实现架构支持
- 支持 LoongArch LA32R 指令集
- 支持 mips32 指令集
- 支持 riscv32 指令集
- abstract-machine:裸机运行时环境(虚拟机),屏蔽底层虚拟机,向上提供基础硬件功能 API
- TRM(Turing Machine) - 图灵机, 最简单的运行时环境, 为程序提供基本的计算能力
- IOE(I/O Extension) - 输入输出扩展, 为程序提供输出输入的能力
- CTE(Context Extension) - 上下文扩展, 为程序提供上下文管理的能力
- VME(Virtual Memory Extension) - 虚存扩展, 为程序提供虚存管理的能力
- nanos-lite:简易操作系统
- 支持内存管理、外设管理、文件管理、中断管理、程序加载、进程管理
- navy-apps:nanos 程序
- libs:nanos 适配,将 NDL 转换为 SDL 提供给应用程序
- apps:nanos应用,包括slides,仙剑奇侠传等
ICS2023
├── abstract-machine # 抽象计算机
├── am-kernels # 基于抽象计算机开发的应用程序
├── fceux-am # 红白机模拟器
├── init.sh # 初始化脚本
├── Makefile # 用于工程打包提交
├── nemu # NEMU
└── README.mdnemu
├── configs # 预先提供的一些配置文件
├── include # 存放全局使用的头文件
│ ├── common.h # 公用的头文件
│ ├── config # 配置系统生成的头文件, 用于维护配置选项更新的时间戳
│ ├── cpu
│ │ ├── cpu.h
│ │ ├── decode.h # 译码相关
│ │ ├── difftest.h
│ │ └── ifetch.h # 取指相关
│ ├── debug.h # 调试用宏
│ ├── device # 设备相关
│ ├── difftest-def.h
│ ├── generated
│ │ └── autoconf.h # 配置系统生成的头文件, 用于根据配置信息定义相关的宏
│ ├── isa.h # ISA相关
│ ├── macro.h # 一些方便的宏定义
│ ├── memory # 访问内存相关
│ └── utils.h
├── Kconfig # 配置信息管理的规则
├── Makefile # Makefile构建脚本
├── README.md
├── resource # 一些辅助资源
├── scripts # Makefile构建脚本
│ ├── build.mk
│ ├── config.mk
│ ├── git.mk # git版本控制相关
│ └── native.mk
├── src # 源文件
│ ├── cpu
│ │ └── cpu-exec.c # 指令执行的主循环
│ ├── device # 设备相关
│ ├── engine
│ │ └── interpreter # 解释器的实现
│ ├── filelist.mk
│ ├── isa # ISA相关的实现
│ │ ├── mips32
│ │ ├── riscv32
│ │ ├── riscv64
│ │ └── x86
│ ├── memory # 内存访问的实现
│ ├── monitor
│ │ ├── monitor.c
│ │ └── sdb # 简易调试器
│ │ ├── expr.c # 表达式求值的实现
│ │ ├── sdb.c # 简易调试器的命令处理
│ │ └── watchpoint.c # 监视点的实现
│ ├── nemu-main.c # 主程序
│ └── utils # 公共功能
│ ├── log.c # 日志文件相关
│ ├── rand.c
│ ├── state.c
│ └── timer.c
└── tools # 一些工具
├── fixdep # 依赖修复, 配合配置系统进行使用
├── gen-expr
├── kconfig # 配置系统
├── kvm-diff
├── qemu-diff
└── spike-diffabstract-machine
├── am # AM相关
│ ├── include
│ │ ├── amdev.h
│ │ ├── am.h
│ │ └── arch # 架构相关的头文件定义
│ ├── Makefile
│ └── src
│ ├── mips
│ │ ├── mips32.h
│ │ └── nemu # mips32-nemu相关的实现
│ ├── native
│ ├── platform
│ │ └── nemu # 以NEMU为平台的AM实现
│ │ ├── include
│ │ │ └── nemu.h
│ │ ├── ioe # IOE
│ │ │ ├── audio.c
│ │ │ ├── disk.c
│ │ │ ├── gpu.c
│ │ │ ├── input.c
│ │ │ ├── ioe.c
│ │ │ └── timer.c
│ │ ├── mpe.c # MPE, 当前为空
│ │ └── trm.c # TRM
│ ├── riscv
│ │ ├── nemu # riscv32(64)相关的实现
│ │ │ ├── cte.c # CTE
│ │ │ ├── start.S # 程序入口
│ │ │ ├── trap.S
│ │ │ └── vme.c # VME
│ │ └── riscv.h
│ └── x86
│ ├── nemu # x86-nemu相关的实现
│ └── x86.h
├── klib # 常用函数库
├── Makefile # 公用的Makefile规则
└── scripts # 构建/运行二进制文件/镜像的Makefile
├── isa
│ ├── mips32.mk
│ ├── riscv32.mk
│ ├── riscv64.mk
│ └── x86.mk
├── linker.ld # 链接脚本
├── mips32-nemu.mk
├── native.mk
├── platform
│ └── nemu.mk
├── riscv32-nemu.mk
├── riscv64-nemu.mk
└── x86-nemu.mknanos-lite
├── include
│ ├── common.h
│ ├── debug.h
│ ├── fs.h
│ ├── memory.h
│ └── proc.h
├── Makefile
├── README.md
├── resources
│ └── logo.txt # Project-N logo文本
└── src
├── device.c # 设备抽象
├── fs.c # 文件系统
├── irq.c # 中断异常处理
├── loader.c # 加载器
├── main.c
├── mm.c # 存储管理
├── proc.c # 进程调度
├── ramdisk.c # ramdisk驱动程序
├── resources.S # ramdisk内容和Project-N logo
└── syscall.c # 系统调用处理navy-apps
├── apps # 用户程序
│ ├── am-kernels
│ ├── busybox
│ ├── fceux
│ ├── lua
│ ├── menu
│ ├── nplayer
│ ├── nslider
│ ├── nterm
│ ├── nwm
│ ├── onscripter
│ ├── oslab0
│ └── pal # 仙剑奇侠传
├── fsimg # 根文件系统
├── libs # 运行库
│ ├── libc # Newlib C库
│ ├── libam
│ ├── libbdf
│ ├── libbmp
│ ├── libfixedptc
│ ├── libminiSDL
│ ├── libndl
│ ├── libos # 系统调用的用户层封装
│ ├── libSDL_image
│ ├── libSDL_mixer
│ ├── libSDL_ttf
│ └── libvorbis
├── Makefile
├── README.md
├── scripts
└── tests # 一些测试以下内容为系统开发目标,✔为开发完成项目
- PA1.1
- 实现单步执行
- 打印程序状态
- 扫描内存
- PA1.2
- 四则运算算数表达式求值
- 16进制数和寄存值支持求值
- 16进制数和寄存值支持求值
- 逻辑表达式支持求值
- 指针解引用支持求值
- PA1.3
- 监视点添加,删除
- 监视点暂停
- 增加开关监视点功能提高NEMU性能
- PA2.1 loongarch32r指令实现
- 算数指令、移位指令
- 立即数相关指令
- 内存操作指令
- 无条件、有条件跳转指令
- PA2.2
- klib(模拟的glibc)实现
- 实现string.h中字符串的基本操作
- 实现stdio中的printf系列函数
- PA2.3
- 基础设施:itrace
- 基础设施:mtrace
- 基础设施:ftrace
- 差分测试:difftest DiffTest 差分测试安装
- 串口输出:serial
- 时钟计时:RTC
- 键盘输入:KeyBoard
- 屏幕输出:VGA
- PA3.1
- 添加系统寄存器
- 添加特权指令
- 异常的进入/恢复机制
- PA3.2
- ELF 文件加载
- 添加自陷系统调用
- 添加程序退出系统调用
- 添加输出系统调用
- 添加堆管理系统调用
- PA3.3
- 简单的文件系统
- 通过文件系统加载ELF
- 文件抽象:串口输出
- 文件抽象:时钟计时
- 文件抽象:键盘输出
- 文件抽象:屏幕输出
- PA3.4
- 定点运算模拟浮点计算
- 将 NDL 库封装为 SDL
- 仙剑奇侠传移植
- PA4.1
- 多道程序创建
- 实现上下文切换
- 用户进程的创建
- 用户栈中参数的设置
- 运行busybox
- PA4.2
- 实现NEMU中的分页机制
- 实现AM中的分页机制
- 实现内核的虚存管理
- 实现用户进程的虚存管理
- PA4.3
- 实现时钟中断
- 完成抢占式多任务
- 实现栈切换
- todo ...
- 7.21 完成PA4.3
- 7.14 完成PA4.2
- 7.1 完成PA4.1
- 4.28 完成PA3
- 4.22 完成 PA2
- 4.14 完成 PA2.2
- 4.9 完成 PA2.1
- 3.24 完成 PA1
- 3.10 完成开发环境配置
[ max] PASS
[ recursion] PASS
[ movsx] PASS
[ crc32] PASS
[ shuixianhua] PASS
[ prime] PASS
[ sum] PASS
[ string] PASS
[ sub-longlong] PASS
[ hello-str] PASS
[ add-longlong] PASS
[ matrix-mul] PASS
[ add] PASS
[ mersenne] PASS
[ pascal] PASS
[ bubble-sort] PASS
[ select-sort] PASS
[ wanshu] PASS
[ bit] PASS
[ goldbach] PASS
[ shift] PASS
[ unalign] PASS
[ mul-longlong] PASS
[ min3] PASS
[ if-else] PASS
[ switch] PASS
[ dummy] PASS
[ mov-c] PASS
[ leap-year] PASS
[ div] PASS
[ to-lower-case] PASS
[ fib] PASS
[ fact] PASS
[ load-store] PASS
[ quick-sort] PASS
- NEMU:虚拟机启动
- 指令集:指令集运行测试
- ALU:运算器测试
- AM:基础外设测试
见开发日志
| 成员 | 分工 | 联系方式 |
|---|---|---|
| 任潇 | 环境迁移和维护、文档撰写 | u202112004@hust.edu.cn |
| 张飞扬 | PA4 开发 | u202112014@hust.edu.cn |
| 阮泽同 | PA3 开发,环境迁移和维护 | u202111009@hust.edu.cn |
团队成员通过对 PA 实验的实现和 LoongArch 移植,增强了对计算机系统整机概念的认识和层次结构的理解,在从下向上逐层抽象地构建虚拟机、简易系统、多道系统并适配程序的过程中,增强了对高级语言程序、ISA、OS、编译器、链接器等之间关系的掌握,透彻理解了指令在硬件上执行的基本过程,并锻炼了自身代码能力。
- 实现 LoongArch 指令,掌握指令执行过程
- 逐层实现 ISA 和 OS,对计算机系统获取抽象掌握
- 进行 PA LoongArch 移植,推动国产化进程