[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执行。

迁移后出现的问题是:(不是同时出现的)

  1. qemu运行时开启debug参数导致结果不一致,开启debug+qemulog会导致卡死等问题。这个问题在ArceOS的mocklibc开发手记中有较为详细的记载,在此不做进一步讨论。
  2. CPUID有问题
  3. Already initialized
  4. 直接跑飞,报一个LoadFault

1. 调试过程

1.1. 处理莫名其妙CPU_ID

通过对过程的追查,确定可能是GP寄存器导致的问题,事实上整个后续流程都是GP寄存器的问题。不过在这个过程中间,我们首先注意到了CPU_ID是一个奇奇怪怪的值,按道理只因该有一个,也就是0,但是似乎是不对的。处理如下:

image-20250124195011583

确定直到进入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.的记录已经是将近一个月之后的事情了。所以现在很难总结出什么东西,只能说尽可能的回想一些。这篇就到这里吧。