首页 > 编程知识 正文

linux内核phy寄存器读写(全志linux驱动写寄存器)

时间:2023-05-04 03:56:53 阅读:74678 作者:679

Linux是x86-64(amd64 )体系结构的系统v ABI; 有关详细信息,请参见OSDev Wiki中的系统v ABI。

这意味着堆栈会变小。 小地址在堆栈中“高”。 典型的c函数是

pushq %rbp; saveaddressofpreviousstackframe

movq %rsp,%rbp; address of current堆栈帧

subq $16,%rsp; reserve 16 bytesforlocalvariables

; function .

movq %rbp,%rsp; equivalent to the

popq %rbp;/'leave' instruction

ret

为局部变量保留的内存量始终是16字节的倍数,以使堆栈与16字节对齐。 如果局部变量不需要堆栈空间,则没有2982409126032180180224等指令。

(请注意,返回地址和前面的2982409126048957957440被推入堆栈中,大小均为8字节,共16字节。 )

%rsp指向当前堆栈框架,%rsp指向堆栈的顶部。 编译器在函数中的任何一点都知道rep ret和ret的区别,因此可以自由使用其中一个作为局部变量的基础。

堆栈帧只是本地函数的游乐场。 当前函数使用的堆栈区域。

每次使用优化时,当前版本的GCC都会禁用堆栈框架。 这是有道理的。 之所以这么说,是因为堆栈帧在用c编写的程序中对调试最有帮助,而在其他方面则用处不大。 但是,也可以使用2982409126048048957440保留堆栈框架并启用其他优化功能。 )

相同的ABI适用于所有二进制文件,但其他语言都需要使用堆栈框架“展开”,而不管是用哪种语言编写的。 例如,向当前函数的祖先抛出异常。 通过“展开”堆栈框架,可以中止一个或多个功能,并将控制权传递给特定的祖先功能,而不会在堆栈中保留不必要的内容。

如果省略堆栈帧,GCC在%rsp-函数实现中将本质上更改为

subq $8,%rsp; re-align堆栈帧,and

; 保留内存for local variables

; function .

addq $8,%rsp

ret

因为没有堆栈帧(%rsp用于其他目的,其值不会被推入堆栈),所以每个函数调用只将返回地址推入堆栈。 因为这是8字节的数量,所以必须将8减去%rsp保持为16的倍数。 (通常,从rep ret中减去后加到rep ret中的值是8的奇数倍。 )

函数参数通常传递给寄存器。 有关详细信息,请参阅此回答开头的ABI链接。 但是,整数类型和指针通常传递给寄存器%rsp、%rsp、rep ret、ret、rep和ret,并且在2982409126048957957446到2982409126048447中有浮点参数

在某些情况下,可能会显示%rsp,而不是%rsp。 不要混淆: rep ret的含义与ret完全相同。 通常,2982409126048957957444前缀与字符串指令(重复指令)一起使用,但应用于ret指令没有任何效果。 但是,由于某些AMD处理器的分支预测变量不希望跳转到ret指令,因此建议在此处使用rep ret。

最后,我忽略了堆栈顶部的红色区域。 地址小于2982409126048957957440的128字节。 这对一般功能没什么帮助。 这是因为对于常规的硬堆栈帧,您希望将本地内容放置在堆栈帧中以启用调试。 如果省略了堆栈框架,则堆栈对齐要求意味着必须从2982409126048957957441中减去8,因此在此减法中包含局部变量所需的内存中不需要成本。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。