当前位置: 首页 > 面试题库 >

为什么不使用RCX将参数传递给系统调用,而用R10代替?

孙帅
2023-03-14
问题内容

根据System V X86-64ABI,应用程序中的函数调用使用以下寄存器序列传递整数参数:

rdi, rsi, rdx, rcx, r8, r9

但是系统调用参数(而不是系统调用号)在另一个寄存器序列中传递:

rdi, rsi, rdx, r10, r8, r9

为什么内核使用r10而不是rcx第四个参数?它与当下rcx没有保留的事实有某种联系r10吗?


问题答案:

X86-64系统调用使用syscall说明。该指令将返回地址保存到rcx,然后ripIA32_LSTARMSR
加载。即rcx立即被摧毁syscall。这就是为什么rcx必须替换系统调用ABI的原因。

相同的syscall指令也保存rflags到中r11,然后rflags使用IA32_FMASKMSR
进行掩码。这就是为什么r11内核不保存它的原因。

因此,这些更改反映了系统调用机制的工作方式。这就是为什么内核被迫声明rcx并且r11未保存,甚至不能使用它们进行参数传递的原因。

参考:英特尔指令集参考,查找SYSCALL



 类似资料:
  • 问题内容: 我当时在Swinject上工作,但问题困扰着我。我已经整整一天都被困在那里。我怀疑这是由于Swift是一种静态类型的语言,但我不确定。 我在这个操场上总结了我的问题 我尝试了不同的解决方案,例如test.self或type(of:test),但它们都不起作用。 所以我想我不能用提供为变量的通用参数来调用函数? 问题答案: 与 协议元类型有两种。对于某些协议和符合类型: A 描述协议本身

  • 问题内容: 在猫鼬文档中,它经常列出某些查询运算符(如)的可选回调,但是,它没有提及回调采用的参数(参数)。他们是什么,我怎么知道? 另外,如果,等都是可选的,我想在结束时指定一个回调,我必须在传递值,或空物体或我可以只指定回调- 和软管做猫鼬知道吗? 问题答案: 对于几乎所有的猫鼬查询,所提供的函数将在文档中所述的节点回调模式 中用两个参数调用: 在Mongoose中将回调传递给查询的任何地方,

  • 问题内容: 我正在尝试使用syscall 在Linux中分配一些内存。这是我尝试过的: 事情是按照linux调用约定,我希望返回值在寄存器中(指向已分配内存的指针)。我在gdb中运行了此文件,并在进行了syscall 后注意到以下寄存器内容 在系统调用之前 系统调用后 在这种情况下,我不太了解寄存器中的值。哪个指针可以用作我分配给它的8个字节的开头的指针? 问题答案: 系统调用返回值始终位于中。请

  • 问题内容: 我有以下jQuery代码在aspx页面中调用webmethod 这是网络方法签名 这很好。 但是现在我需要将两个参数传递给Web方法 新的网络方法如下所示 如何更改客户端代码以成功调用此新方法签名? 编辑: 以下2种语法有效 和 其中filter和locale是局部变量 问题答案: 不要使用字符串串联来传递参数,只需使用数据哈希即可: 更新: 正如@Alex在注释部分所建议的那样,AS

  • 问题内容: 我有一个简单的web方法和ajax调用,并继续收到一个错误,说它无法将字符串转换为IDictionary对象? 这是ajax调用: 这是webMethod: 这是我从FireBug中看到的内容: 响应标头 服务器:Microsoft-IIS / 5.1 日期:2009年4月9日,星期四,格林尼治标准时间 jsonerror:true 缓存控制:私有 内容类型:application /

  • 我有一个内核模块(4.4.32内核),它通过将ioctl处理程序分配给< code > struct file _ operations 的< code>unlocked_ioctl指针来实现ioctl调用。一切正常,但是我得到的程序(只有二进制)是为2.6或者2.4内核编译的,如果我在4.4.32上启动这个程序,它不会让内核为我的模块注册一个对ioctl的调用。因为此程序是在旧内核上编译的,所以