2.4.2 supervisor的启动过程

移植介绍

使用如下命令下载supervisor的源码

git clone https://github.com/z4yx/supervisor-mips32.git

修改/kernel/kern/init.S 文件

在111行起始处,将原来控制串口可读中断部分代码注释,加入适配MNaive MIPS的关中断程序,之后再加入等待同步的程序。

修改/kernel/kern/kernel.lh文件

将 SerialData 的地址改为 0xBFD03000,SerialStat的地址改为0xBFD03014

修改/kernel/kern/utils.S文件

在15行起始处,修改 截取写状态位 地址为 0x0020

在37行起始处,修改 截取读状态位 地址为 0x0001

修改/term/term.py文件

第30行,将编译环境指定为龙芯编译环境的绝对路径 CCPREFIX = '/opt/gcc-4.3-ls232/bin/mipsel-linux-'

第61行,修改 len(binary) == 16 and binary[ 4 : ] = '\0' * 12:

说明一下,这里是修改代码段的数据大小。对于龙芯的编译环境,.text的大小是16字节,其中前四个字节是代码数据,后面12个字节是 '\0',所以需要判断并提取出来。 至于如何查看.text的大小,可以编一个文本进行格式转换,假如现在已经编译了一个 a.out文件 mipsel-linux-objcopy -j.text a.out -Obinary b 即可查看.text的大小

在kernel目录下,输入如下命令编译程序

make clean
make ON_FPGA=y

也可以直接修改makefile文件第19行为 override ON_FPGA ?= y,则可以输入make 编译程序

若编译失败,检测配置的交叉编译环境 在mmakefile第7行处更改

使用介绍

监控程序,能够接受用户命令,支持输入汇编指令并运行,查看寄存器及内存状态等功能。监控程序可在学生实现的 32 位 MIPS CPU 上运行,一方面可以帮助学生理解、掌握 MIPS 指令系统及其软件开发,另一方面可以作为验证学生 CPU 功能正确性的标准。

监控程序分为两个部分,Kernel 和 Term。其中 Kernel 使用 MIPS32 汇编语言编写,运行在实现的 CPU 中,用于管理硬件资源;Term 是上位机程序,使用 Python 语言编写,有基于命令行的用户界面,达到与用户交互的目的。Kernel 和 Term 直接通过串口通信,即用户在 Term 界面中输入的命令、代码经过 Term 处理后,通过串口传输给 Kernel 程序;反过来,Kernel 输出的信息也会通过串口传输到 Term,并展示给用户。

Term

Term 程序运行在实验者的电脑上,提供监控程序和人交互的界面。Term 支持7种命令,它们分别是

  • R:按照$1至$30的顺序返回用户程序寄存器值。

  • D:显示从指定地址开始的一段内存区域中的数据。

  • A:用户输入汇编指令,并放置到指定地址上

  • U:从指定地址读取一定长度的数据,并显示反汇编结果。

  • G:执行指定地址的用户程序。

  • T:查看指定的TLB条目。本功能仅在Kernel支持TLB时有效。

  • Q:退出 Term

利用这些命令,实验者可以输入一段汇编程序,检查数据是否正确写入,并让程序在处理器上运行验证。

启动term.py程序之前,需要进行串口通信同步,打开minicom,看到terminal不断的显示 ...,按下回车,出现"Monitor initial",同步成功。 此时可以启动term.py Term 程序位于`term`文件夹中,可执行文件为`term.py`。运行程序时用 -s 选项指定串口。例如:

./term.py -s /dev/ttyUSB0(串口名称根据实际情况修改)

用户程序编写

根据监控程序设计,用户程序的代码区为0x80100000-0x803FFFFF,实验时需要把用户程序写入这一区域。

用户程序的最后需要以jr $31结束,从而保证正确返回监控程序。

在输入用户程序的过程中,既可以用汇编指令,也可以直接写16进制的机器码。空行表示输入结束。

以下是一次输入用户程序并运行的过程演示:

MONITOR for MIPS32 - initialized.
>> A 
>>addr: 0x80100000 
one instruction per line, empty line to end. 
[0x80100000] addiu $2,$0,1 
[0x80100004] addu $3,$2,$2 
[0x80100008] jr $31 
[0x8010000c] nop 
[0x80100010] 
>> U 
>>addr: 0x80100000 
>>num: 16 
0x80100000: li v0,1 
0x80100004: addu v1,v0,v0 
0x80100008: jr ra 
0x8010000c: nop 
>> G 
>>addr: 0x80100000 

elapsed time: 0.000s 
>> R 
R1 (AT) = 0x00000000 
R2 (v0) = 0x00000001 
R3 (v1) = 0x00000002 
R4 (a0) = 0x00000000 
R5 (a1) = 0x00000000 
R6 (a2) = 0x00000000 
...

进阶一:中断和异常支持

作为扩展功能之一,Kernel 支持中断方式的I/O,和 Syscall 功能。要启用这一功能,编译时的命令变为:

make ON_FPGA=y EN_INT=y

这一编译选项,会使得代码编译时增加宏定义`ENABLE_INT`,从而使能中断相关的代码。

进阶二:TLB支持

在支持异常处理的基础上,可以进一步使能TLB支持,从而实现用户态地址映射。要启用这一功能,编译时的命令变为:

make ON_FPGA=y EN_INT=y EN_TLB=y

Last updated