如何正确地将“动态ftrace与寄存器”支持移植到Pixel 3a ARM64内核?

我目前正在集成ARM64 ftrace补丁,以全面支持“带寄存器的动态ftrace”。具体来说,我正在为Pixel 3a(sargo)开发4.9.200内核版本,而我所指的补丁如下:

前面提到的补丁需要对'-fpatchable-function-entry = 2'GCC 8.x编译选项的支持,我之所以将支持集成到GCC 9.1中以构建内核是因为。使用此选项编译内核会在每个可跟踪函数的序言中正确插入2条ARM64 NOP指令。

问题是,使用从移植的“带有寄存器的动态ftrace”补丁(4.8.x和4.20.x确实很相似)编译的内核在从内核态到用户态的转换过程中崩溃,特别是在对do_execve的调用中()”以生成“ / init”。崩溃内核中的ftrace初始化和整个初始引导顺序与正确引导的内核相同(例如,支持“启用动态ftrace而无寄存器”的内核)。

详细日志(“ debug”,“ ignore_loglevel”,“ initcall_debug”和增加的日志缓冲区移位)已启用,并且崩溃实际上并未显示失败的原因(例如,无效的指令执行,无效的内存访问)。

已尝试启用对KASAN + KCOV的完全支持,但由于生成的LZ4图像太大而无法由Pixel 3a引导加载程序加载,因此导致无法继续进行,导致出现“ FAILED(远程:'错误验证收到的boot.img:缓冲区太小')“ fastboot错误。可以刷新启动映像,但是崩溃后设备会进入启动循环阶段,无法从“ / sys / fs / pstore”获取日志,因为新刷新的正常启动映像会导致崩溃日志刷新。

作为另一种尝试,已将4.8.x修补程序移植到4.9.x内核,将4.20.x修补程序移植到了HiKey620板(基于ARM64)的4.19.x内核,从而成功启动了两者情况(使用从“ master”分支编译的最新AOSP),并有可能通过内核模块中的API使用“带有寄存器的动态ftrace”。在这一点上,我一直想知道HiKey620开发板的4.9.x内核与Pixel 3a可能有什么区别。

I've also been playing with the kernel option 'CONFIG_DEBUG_RODATA' to disable the read only memory enforcing (e.g. this old issue https://github.com/raspberrypi/linux/issues/2166 is hinting to the ARM kernel crashing when ftrace is enabled and it turned out to be a read-only memory issue); in my case the full boot sequence is working fine so I excluded that as a possible cause.

为了确保根本不执行“ / init”(实际上是“ / system / bin / init”)二进制文件,我在入口点中放置了一些日志和无限循环作为真正的第一条指令(“ int main(..) ”(init / main.cpp”文件)和启动过程显然没有达到这一点,因此这使我排除了“第一”和“第二”初始用户土地阶段设置功能的问题。

以下链接指向崩溃的内核(带有“带有寄存器的动态ftrace”的4.9.200)和引导内核(带有带有“没有寄存器的动态ftrace”的4.9.200)的详细日志:

调试问题的最佳方法是什么?是否有明显的原因导致我失踪?

评论