概述
这一系列分上下两章,上章讲TestOS的前六个部分在移植K210开发板遇到的问题,下章讲TestOS的文件部分移植的问题。这里选用K210开发板的原因是rCore教程提供了K210的使用教程,同时RustSBI也提供了相应的适配,使得我能够在几乎不改变内核代码的情况下进行移植,所以还是感谢rCore教程的作者、RustSBI的作者洛佳大佬以及借我开发板的ccc大佬。
内容
第一部分
第一部分没什么需要修改的,主要是学习开发板的使用。首先将开发板使用Type-C的数据线连上电脑。由于我编译和烧录使用的是虚拟机,所以需要映射USB端口,VirtualBox启动系统后窗口右下角有个USB的图标,右键点击,选择那个中文拼音的端口打上勾,就映射成功了。然后下载烧录工具,把项目里的kflash.py下载下来。为了获得K210的输出信息,需要安装串口通信的Python库:
pip3 install pyserial
修改makefile:
rustsbi-k210_size := 131072
k210_serialport := /dev/ttyUSB0
k210:
riscv64-unknown-elf-gcc os.c printf.c entry.S -T linker_k210.ld -ffreestanding -nostdlib -g -o os_k210 -mcmodel=medany
riscv64-unknown-elf-objcopy os_k210 --strip-all -O binary os_k210.bin
@cp rustsbi-k210.bin rustsbi-k210.copy
@dd if=os_k210.bin of=rustsbi-k210.copy bs=$(rustsbi-k210_size) seek=1
@mv rustsbi-k210.copy os_k210.bin
@sudo chmod 777 $(k210_serialport)
python3 kflash.py -p $(k210_serialport) -b 1500000 os_k210.bin
python3 -m serial.tools.miniterm --eol LF --dtr 0 --rts 0 --filter direct $(k210_serialport) 115200
除了编译之外,需要建立一个二进制映像文件,包含rustsbi-k210.bin和编译出的os_k210.bin。具体操作是先将rustsbi-k210.bin复制一份,然后使用dd命令将其和编译出的os_k210.bin组合成二进制映像文件,注意os_k210.bin必须放在新文件里偏移量为rustsbi-k210_size的位置,rustsbi-k210_size的值是将rustsbi-k210.bin的文件大小按4096字节向上对齐的结果。K210版的链接脚本也有区别,需要修改一下内核的起始地址,因为rustsbi-k210强制指定了从0x80020000这里启动内核。
接着通过kflash.py把映像烧录到端口设备文件,在我的系统上这个设备文件是/dev/ttyUSB0。在烧录的时候终端会出现一个[INFO] Trying to Enter the ISP Mode...
的提示,这个时候需要按住K210开发板上的Boot按钮,才能识别到开发板。识别过后就会开始烧录,烧录完就可以运行了。我在识别和烧录的过程中都有可能发生连接失败的错误,不知道是数据线、接口的问题还是开发板都会这样。
运行的过程中可以按K210开发板上的Reset按钮重启内核,终端上的输出有时候会混乱或缺失,我猜测应该是串口通信的刷新率问题,毕竟这里不像qemu那样是直接输出,K210的输出传到终端还是需要一定时间的,运行太快而丢失输出信息也不是不可能。内核运行结束后如果正常调用RustSBI的关机功能会输出:
[rustsbi] reset triggered! todo: shutdown all harts on k210; program halt. Type: 0, reason: 0
关机以后也可以按Reset按钮重启内核,关机以后串口通信程序仍在运行,需要手动退出。退出的快捷键是Ctrl+]
(一开始没看到程序启动时的提示,以为只能用kill命令强制退出