[TOC]
0. 问题的出现
在为ArceOS实现pthread系函数的时候,迁移了杨金全同学的实现方法:
杨金全同学自行实现了__libc_start_main函数,并对App中的PLT表进行查询重填,使得PLT表中__libc_start_main的表项指向ArceOS中实现的__libc_start_main函数。在这个函数中,调用了axtask下的init_scheduler方法完成分配器的初始化,然后去执行main函数。
我迁移的操作如下:我的执行流程是ArceOS调用Lib中的自己实现的函数_start和_start_c,在_start_c中调用ArceOS提供的,封装了init_scheduler操作的接口,然后调用main函数进入App执行。
迁移后出现的问题是:(不是同时出现的)
- qemu运行时开启debug参数导致结果不一致,开启debug+qemulog会导致卡死等问题。这个问题在ArceOS的mocklibc开发手记中有较为详细的记载,在此不做进一步讨论。
- CPUID有问题
- Already initialized
- 直接跑飞,报一个LoadFault
1. 调试过程
1.1. 处理莫名其妙CPU_ID
通过对过程的追查,确定可能是GP寄存器导致的问题,事实上整个后续流程都是GP寄存器的问题。不过在这个过程中间,我们首先注意到了CPU_ID是一个奇奇怪怪的值,按道理只因该有一个,也就是0,但是似乎是不对的。处理如下:

确定直到进入main之前都还是正确的,于是在这里保存了CPU_ID
==更正:这个部分什么都没干!是我理解错了。==
1.2. 处理Already initialized与跑飞
在already initialized问题中,确定了是我自己写的_start函数出现了问题。正常的musl调用流程是从_start开始,到_start_main_c,然后调用main函数。但是我自己实现的start函数似乎存在一些问题。而其中gp寄存器被一个依赖crates:percpu用于干别的事儿,但是我那个start函数并没有很好处理这个事情,导致跑飞了。
==这里的记录已经是很久很久之后的事情了,完全想不起来。建议配合着1月24日前后的提交记录去查看。==
1.3. 处理LoadFault
其实LoadFault好像直接被解决了,之后并没有遇到。
==这里的记录已经是很久很久之后的事情了,完全想不起来。建议配合着1月24日前后的提交记录去查看。==
2. 总结
十分糟糕,写完1.1之后就没有再动笔了,1.2.的记录已经是将近一个月之后的事情了。所以现在很难总结出什么东西,只能说尽可能的回想一些。这篇就到这里吧。