# 调试经历经验记录

1. 当时发现有东西改了物理内存分配器的结构，发现.sbss节被链接器放到了我们认为的内核末尾后面了，就出问题了，更改链接脚本解决

2. 在分配页表的时候要求对齐到4KB，使用时没注意，导致出问题，得到的经验是这种需要对齐的地方ASSERT一下，防止万一出问题

3. 上板启动总是进不去，经过群内大佬提醒发现是开启页表后，PC还在原地，而没有页表了，就出问题了，解决方案是增加一个自映射页表项

4. 测试系统调用用例过程中出现的读写访问错误问题：

   ​		通过很长时间的看汇编代码输出推断出是vfs的虚表指针被修改导致的错误

   ​		然后就是在FAT32的调用路径中不断输出虚表指针看什么时候变化

   ​		找到是物理内存分配器分配了两次同一个地址

   ​		（最终是物理内存分配器里有一行没写好）

5. 链表版本的物理内存分配器链接断掉了，导致分配了没几个页就分配不了了
6. K210上的用户进程fork后无法执行：当时绞尽脑汁在调试了，完全不知道是哪里的问题，发现症状是所有fork出来的进程都有问题，因此怀疑是fork这一块的，也就是通过trapframe来Start的部分，然后尝试修改sstatus权限，测试的时候尝试全部放内核态执行，因此需要能访问用户空间，然后就发现只要启用全局允许内核访问用户空间可以解决（虽然不知道为什么，感觉应该是有其他原因）（后来又发现不需要这样处理了，可能是在继续写的途中无意修复了某个bug）
7. 本地测试跑得完全没问题，但提交平台测试总是跑出问题，通过不断地输出情况分析后，发现是FAT32中一些细节参数的了解有问题，即平台上是0F FF FF F8，而我们代码中写的是0F FF FF FF，导致Cluster跑飞了，而访问磁盘时的LBA又没有判断范围，改过来就好了。教训是一些地方要多加判断，以晒去意料之外的非法值。
8. ……



-----------------------------

By：qianpinyi

2022.06.05