目前,我正在为ARM架构使用嵌入式Linux内核。作为bootlin提供的最新内核源代码,我在arch/arm/内核/entry-Common.S中看到了这些代码。
slow_work_pending:
mov r0, sp @'regs'
mov r2, why @'syscall'
bl do_work_pendingsyscall参数do_work_pending()的假设是r1吗?
在启动内核时,我尝试通过打印该参数来调试这个参数。当时why寄存器应该是0,但是printk说syscall是-173b500。
这些代码是错误的还是故意编码的?
我认为在内核启动时,why应该是0,因为它不是真正的syscall,但是用printk打印它会给出奇怪的负数。我对why的理解错了吗?
发布于 2019-12-20 17:55:23
考虑到最近的上游源是如何具有相同的代码的(尽管文件名已经更改为用一个_替换-),那么除非它是一个非常罕见的代码路径,否则它可能是没有错的。很可能你误解了这里发生的事情。
但让我们看看细节
slow_work_pending:
mov r0, sp @'regs'
mov r2, why @'syscall'
bl do_work_pending是否可以将do_work_pending()的syscall参数设为r1?
考虑到signal.c中函数的原型
asmlinkage int
do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)答案似乎是“否”-- syscall是第三个参数,因此应该在r2中,因为r1包含thread_flags --在您研究的围绕slow_work_pending的代码之前,大概已经这样做了。
https://stackoverflow.com/questions/59425671
复制相似问题