You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.7 KiB

2018操作系统专题训练

最终报告

计53 王润基 2015011279

2018.12.27

本学期工作总结

  • 实现各平台多核启动和调度
  • 完善文件系统相关功能
  • 实现NoMMURISCV M-ModeRV64K210支持

后半学期任务报告

NoMMU

原理

  • 去掉内存分页映射机制,将用户程序加载到任意地址运行
  • 内核为剩余物理内存空间建立另一个堆分配器(原来是用作物理帧)
  • 当加载用户程序时,分配一段连续内存空间,并计算新的入口地址

位置无关代码

  • 用户程序需使用相对寻址
    • 代码段使用相对跳转
    • 数据段使用相对寻址或去GOT全局偏移表查询地址
  • 为此需添加编译选项:
    • 编译时-fPIC(位置无关代码)
    • 链接时-pie(位置无关可执行程序)
  • 原来ucore编译出的用户程序x86绝对寻址RISCV相对寻址

有待完善的地方:

  • 实现GOT表的填写即可支持代码段和数据段分别分配地址

RISCV M-Mode

将现有的运行于S态的kernel移植到M态。

BBL为kernel提供了很多底层功能因此需要保留。

具体任务

  • 去掉分页机制NoMMU
  • 让BBL保持M态进入kernel
  • 将kernel中操作的S-CSR改为M-CSR
  • 融合kernel和BBL的运行环境

BBL提供的功能

  • SBIgetcharputcharIPI
  • 时间与时钟中断模拟rdtime提供set_timer()
  • CPU不支持的指令模拟乘除、浮点等

融合kernel和BBL

  • 中断原来kernel和BBL各有一套中断处理流程融合后以kernel的为主体
  • SBIBBL将相关函数符号传给kernelBBL的角色变为静态库
  • 委托中断处理:当发生IllegalInstMachineEcall异常时调用BBL的函数处理

问题

  • QEMU中mie.MEIEM态外设中断不可开启可能是个Bug。导致串口中断不工作只能使用轮询方式getchar。
  • M态BBL是否还有存在的意义
    • RV下boot十分简单
    • BBL依赖FDT设备树初始化外设但一般只有M态的开发版都不提供FDT。

RV64 & K210

  • 基于dzy同学的两阶段编译流程Rust=>LLVM-IR=>Machine

  • 12月17日LLVM master已经完善地支持rv64RustOS完整编译通过

  • 此后配合dzy完成rv64移植

地址空间处理

  • llc不支持code-model=medium即位于任意地址4G范围内
  • 对此张蔚同学做了一个patch但编译RustOS仍有问题因此没用上
  • 于是目前只能将代码和数据放在+-2G区域即[0,0x7fffffff], [0xffffffff_80000000, 0xffffffff_ffffffff]
  • 在QEMU/HiFiveU上支持S态、有页机制。因此将地址放在0xffffffff_80000000。需在BBL中设置初始页表并建立好映射然后再进入S态Kernel
  • K210上RAM位于0x80000000但也可以通过0x40000000访问无cache。因此将地址放在0x40000000。

K210适配

  • 主要参考官方SDK
  • 串口:
    • 使用UARTHS和普通UART规范不一致
    • 在boot阶段就初始化好方便调试
    • TODO串口事件中断
  • 原子操作:
    • 原子指令对0x40000000地址区无效
    • 解决方法:在自己实现的__atomic_*函数中将地址移到0x80000000处。
  • 多核:
    • reset后同时开始运行不需额外boot
    • 目前只用了单核因为还有Bug……
  • 时钟中断:
    • SDK中的处理较为复杂懒得重新造轮子
    • 将SDK编译为静态库链接到kernelkernel导入符号使用
  • 修复前期M-Mode的Bug

搞K210的困难

  • 没有完整的模拟器(其实部分也够了)
  • 烧程序慢导致实验验证周期长提高波特率2min->0.5min

其它

  • 适配 Rust 2018 edition
  • 实现文件内存映射用户程序内存均延迟分配以后可实现mmap