有时候真是怀疑自己的智商,用了两周谷歌出来了一个GRUB实现的bootloader。
原来github上的代码这么有用。
linux命令行的cd,vim操作
C语言asm volatile函数的用法
qemu,vnc viewer的使用
2020/5/4
C语言宏定义 va_start(ap, last) (真惨啊,上了三年大学到现在还在学C语言的宏定义)
ls -R
gdb
2020/5/6
gdb调试
找到了清华大学的操作系统课,打算跟着学,估计会少走很多弯路。。。(即使我已经走了三周弯路)
2020/5/7
安装nightly rust,利用cargo创建了二进制项目
移除项目对现有操作系统的依赖,通过:移除项目的标准库依赖和运行函数依赖,并且编写了panic函数(虽然并没有功能)
开始用notion记笔记了
2020/5/09
改用riscv64编译项目
为项目设置了默认的目标三元组
生成了内核镜像(没有调试信息,不解析elf文件)
通过编写连接脚本指定内核镜像的内存布局,再生成指定内存布局的内核镜像
重写程序的入口点_start,使其指定了内核的栈,然后使用call指令进入rust_main函数
~~ ~~
Qemu内置了OpenSBI(主要功能是硬件初始化和加载操作系统(就是一个bootloader))
我们使用qemu内置的
qemu-system-riscv64 \
--machine virt \
--nographic \
--bios default
-device loader,file=$(bin),addr=0x80200000
命令运行OpenSBI,并且指定我们生成的内核镜像
通过封装此命令到Makefile中,可以简单地使用make run 来运行此命令
~~ ~~
我们使用内联汇编,通过ecall发起系统调用,使用opensbi为我们提供的扩展sbi_console_putchar,来实现向屏幕实处字符的功能
~~ ~~
内联汇编
makefile 文件格式
实现了println!函数,格式化输出,具体的语法还需要学习
rust use和extern的用法
rust impl
还需要回顾的地方:实现格式化输出
2020/5/10
添加了保护现场的汇编代码。。。。。
触发中断时先保存现场然后进入rust_trap,最后恢复现场。。。。
我真是个菜鸡。。