linux - 为什么系统调用会破坏 rcx 和 r11?
问题描述
在《低级编程:英特尔® 64 架构上的 C、汇编和程序执行》一书中,它说,
关于系统调用参数 系统调用的参数与函数的参数存储在一组不同的寄存器中。第四个参数存储在 中
r10
,而函数接受第四个参数rcx
!原因是
syscall
指令隐式使用rcx
. 系统调用不能接受超过六个参数。
您可以在此Stack Overflow 帖子中看到这一点,
系统调用是通过 syscall 指令完成的。这会破坏 %rcx 和 %r11 以及 %rax,但会保留其他寄存器。
我了解rax
存储返回代码的破坏,但为什么是rcx
, 和r11
破坏syscall
?是否有破坏rcx
/的特定系统调用的列表r11
?有没有关于破坏的约定?它们在任何系统调用中都被认为是安全的吗?
解决方案
syscall指令用于rcx
存储下一条要返回的指令的地址,并保存r11
寄存器的值rflags
。然后这些值将由sysret
指令恢复。
这是由 CPU 在执行 CPU 指令时完成的,因此任何特定于操作系统的调用约定都需要避免使用这些寄存器将参数传递给系统调用。
推荐阅读
- php - 未找到 Laravel 视图 5.2
- javascript - 将图像转换为 base64 时无法读取未定义的属性“宽度”?
- c# - 如何使用数据合同将模式版本号添加到 xml 中的节点?
- ajax - 什么是 AJAX?它是如何工作的?
- python - 验证用户是否使用英文或拉丁字符,如果不是则发出警告
- javascript - 此实验语法需要启用解析器插件:'exportDefaultFrom'
- sql-server - 计算具有别名的两列之间的百分比差异
- javascript - Symbol.for() 是 String.getHashCode() 的一个很好的替代品吗?
- html - 复制/粘贴页面源不会重新创建相同的网页。为什么不?
- mysql - MySQL Workbench 重命名参考