System Learning Daily 4

记录一些想法。

关于QEMU和Bochs的选择

  1. 根据我自己的观察,使用Bochs的人似乎更多一些。我自己却是使用QEMU + GDB。
  2. Bochs的优势在于调试这种裸机程序很好用。例如,在Bochs自带的调试器里面使用info gdt直接可以查看gdt,相较于QEMU + GDD更方便。
  3. QEMU + GDB的好处就是可以借助GDB的强大功能,Bochs也可以使用GDB,但是必须关闭自带的调试器才行。而QEMU则可以两者同时使用。
  4. 两者的行为有些地方也不一致,例如QEMU默认的IF是set的,Bochs的IF是clear的。

无限循环引发GP

GP就是General Protection Exception这个问题应该在我之前的项目中就出现过,不过我没有发现。这次发现主要是使用了QEMU的 -d-D 选项,在处理器发生reset或者interrupt的时候打出log。

记录一下自己发现的过程。

  1. 在实模式下面,jmp $不会引发GP
  2. 在保护模式下面,QEMU在运行到jmp $的时候直接重启Guest OS。
  3. 使用-d int,cpu_reset-D qemu.log来查log发现是triple fault导致的重启。
  4. triple fault发生的原因是两次GP加上一个double fault,参考了这个帖子Reddit
  5. 让人疑惑的事情是,如果在gdb中使用continue则会出问题,如果使用step则不会出问题。IF set之后会出问题,IF clear之后不会出问题。在OSDev已经发帖问了。不清楚这究竟是处理器的机制还是我自己写的代码有问题。

CMake和Make的选择

写这种东西还是Make比较好用。CMake写起来是真的繁琐。还需要add_custom_target,语法噪音很多。不如Make直接一个target后面直接放上去命令来的简单明快。

Linker Script并不难

想不通几个月前的自己竟然浪费了不少时间在这个上面。

内核要用ELF文件格式

之前使用的就是一个flat binary,刚开始还好,再往后就很容易出问题。非常不好管理。

Just for Fun

哪怕是对操作系统感兴趣,写起来遇到问题也是足够让人难受了。

得让自己开心。