System Learning Daily 4
记录一些想法。
关于QEMU和Bochs的选择
- 根据我自己的观察,使用Bochs的人似乎更多一些。我自己却是使用QEMU + GDB。
- Bochs的优势在于调试这种裸机程序很好用。例如,在Bochs自带的调试器里面使用
info gdt直接可以查看gdt,相较于QEMU + GDD更方便。 - QEMU + GDB的好处就是可以借助GDB的强大功能,Bochs也可以使用GDB,但是必须关闭自带的调试器才行。而QEMU则可以两者同时使用。
- 两者的行为有些地方也不一致,例如QEMU默认的IF是set的,Bochs的IF是clear的。
无限循环引发GP
GP就是General Protection Exception这个问题应该在我之前的项目中就出现过,不过我没有发现。这次发现主要是使用了QEMU的 -d 和 -D 选项,在处理器发生reset或者interrupt的时候打出log。
记录一下自己发现的过程。
- 在实模式下面,
jmp $不会引发GP - 在保护模式下面,QEMU在运行到
jmp $的时候直接重启Guest OS。 - 使用
-d int,cpu_reset和-D qemu.log来查log发现是triple fault导致的重启。 triple fault发生的原因是两次GP加上一个double fault,参考了这个帖子Reddit。- 让人疑惑的事情是,如果在gdb中使用
continue则会出问题,如果使用step则不会出问题。IFset之后会出问题,IFclear之后不会出问题。在OSDev已经发帖问了。不清楚这究竟是处理器的机制还是我自己写的代码有问题。
CMake和Make的选择
写这种东西还是Make比较好用。CMake写起来是真的繁琐。还需要add_custom_target,语法噪音很多。不如Make直接一个target后面直接放上去命令来的简单明快。
Linker Script并不难
想不通几个月前的自己竟然浪费了不少时间在这个上面。
内核要用ELF文件格式
之前使用的就是一个flat binary,刚开始还好,再往后就很容易出问题。非常不好管理。
Just for Fun
哪怕是对操作系统感兴趣,写起来遇到问题也是足够让人难受了。
得让自己开心。