Linux kernel armlinux内核头common.S

Linux kernel armlinux内核头common.S,linux-kernel,arm,Linux Kernel,Arm,我看起来很普通 在uuu mmap_u开关处: .long init_thread_union + THREAD_START_SP @ sp //for stack pointer THREAD_START_SP是在“THREAD+info.h”中定义的线程大小(8192)-8 设置堆栈大小为8KB(8129)和负8字节 为什么是负8字节 我怀疑,我认为DA(减量后)正确吗?8字节对齐是APCS的要求 在APCS中,第5.2.1章介绍了堆栈 堆栈在公共接口上还必须符合以下约束: SP mo

我看起来很普通

在uuu mmap_u开关处:

.long   init_thread_union + THREAD_START_SP @ sp //for stack pointer
THREAD_START_SP是在“THREAD+info.h”中定义的线程大小(8192)-8

设置堆栈大小为8KB(8129)和负8字节

为什么是负8字节


我怀疑,我认为DA(减量后)正确吗?

8字节对齐是APCS的要求

在APCS中,第5.2.1章介绍了堆栈

堆栈在公共接口上还必须符合以下约束:

SP mod 8=0。堆栈必须双字对齐。


相反,在(完全下降-FD)之前减量-ARM
push
/
pop
助记符实现为
stmfd sp
ldmfd sp所以它在按下之前是递减的,在按下之后是递增的。但由于ARM上的字只有四个字节,这种差异无法解释为什么它保留了八个字节。我猜是一个初始的
fp
/
lr
对,但需要查找eABI来验证。FrankH//感谢您的评论:)可能的重复项根本无法回答“为什么”。如果减去8使其保持8字节对齐,那么它之前已经是8字节对齐的。