Skip to content

oscomp/first-prize-osf2024-RRAM

Repository files navigation

RRAM-开发文档

队伍

RRAM 队

赛题

Project 241: PA for LA

南京大学 PA 实验的 LoongArch 支持。通过构建一个简单完整的计算机系统,来深入理解程序如何在计算机上运行。

PA 实验从 ISA 模拟器实现开始,逐步到运行时库函数和真实应用程序,构建从下到上逐步抽象的完整计算机系统。当前 PA 实验缺少对 LoongArch 的实验指导和调试工具,需要对 LoongArch 进行移植适配。对PA实验的loongarch的补充文档已经提交PR

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.md

NEMU

nemu
├── 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-diff

ABSTRACT-MACHINE

abstract-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.mk

NANOS-LITE

nanos-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

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

  • PA1.1
    • 实现单步执行
    • 打印程序状态
    • 扫描内存
  • PA1.2
    • 四则运算算数表达式求值
    • 16进制数和寄存值支持求值
    • 16进制数和寄存值支持求值
    • 逻辑表达式支持求值
    • 指针解引用支持求值
  • PA1.3
    • 监视点添加,删除
    • 监视点暂停
    • 增加开关监视点功能提高NEMU性能

PA2

LoongArch 工具链安装

  • PA2.1 loongarch32r指令实现
    • 算数指令、移位指令
    • 立即数相关指令
    • 内存操作指令
    • 无条件、有条件跳转指令
  • PA2.2
    • klib(模拟的glibc)实现
    • 实现string.h中字符串的基本操作
    • 实现stdio中的printf系列函数
  • PA2.3
    • 基础设施:itrace
    • 基础设施:mtrace
    • 基础设施:ftrace
    • 差分测试:difftest DiffTest 差分测试安装
    • 串口输出:serial
    • 时钟计时:RTC
    • 键盘输入:KeyBoard
    • 屏幕输出:VGA

PA3

龙芯异常处理文档

  • PA3.1
    • 添加系统寄存器
    • 添加特权指令
    • 异常的进入/恢复机制
  • PA3.2
    • ELF 文件加载
    • 添加自陷系统调用
    • 添加程序退出系统调用
    • 添加输出系统调用
    • 添加堆管理系统调用
  • PA3.3
    • 简单的文件系统
    • 通过文件系统加载ELF
    • 文件抽象:串口输出
    • 文件抽象:时钟计时
    • 文件抽象:键盘输出
    • 文件抽象:屏幕输出
  • PA3.4
    • 定点运算模拟浮点计算
    • 将 NDL 库封装为 SDL
    • 仙剑奇侠传移植

PA4

  • 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 移植,推动国产化进程

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •