在测试阶段我发现几个有趣的问题,先记录下来供大家参考
1在Makefile里面链接部分你会发现有个参数是-N这是因为ld为了内存页对齐设置的,如果不加参数-N会导致生成的kernel过大从而导致grub在加载内核时
不能检测到multiboot2文件头,进而不能正确引导内核,这个是自己进行好几天多阶段排除得来的结果,目前网上这个答案仅此一家,心酸过程就不说了,大家可以试着
取消掉这个参数进行文件大小对比测试.
2在虚拟机上是可以正确检测到内存大小的,但是在真机上不行,mem_upper总是500多M,而且在虚拟上检测的内存map总是相同的不随内存大小变化而变化
在真机上测试发现内存map最后一项总是看不懂,因为最后一项是从0-1M开始的近乎包含所有内存只是最后第二项的基址加上大小就是内存的总大小
所以我将内存map的数量减去1来确定真机的真正内存大小.
3在真机测试阶段我同时发现grub将从BIOS获取的参数同时保存到了grub将内核加载的位置,这是非常麻烦的问题,我不能保证内核数据是否遭到破坏
目前内核还可以正常运行,先记录下来等待错误发生进行处理
4由于第三个问题的原因我先将内存进行地址映射然后才进行启动参数的拷贝,这导致在初始化阶段内存映射固定不变(896M),所以为了简单,我预留了
1M空间存放页表用来映射3G-4G内核空间
5在链接脚本里面你会发现内核是从16M开始的,原先我打算使用文件包含方式把boot.o放在内核文件的头部,但考虑到可以启动阶段会重新改写,从而导致函数和
变量多次定义的问题,所以我将所有的启动代码放在了.text.head段中从而保证在后续代码中链接脚本和代码不会有过大的修改.