根据System V X86-64ABI,应用程序中的函数调用使用以下寄存器序列传递整数参数:
rdi, rsi, rdx, rcx, r8, r9
但是系统调用参数(而不是系统调用号)在另一个寄存器序列中传递:
rdi, rsi, rdx, r10, r8, r9
为什么内核使用r10
而不是rcx
第四个参数?它与当下rcx
没有保留的事实有某种联系r10
吗?
X86-64系统调用使用syscall
说明。该指令将返回地址保存到rcx
,然后rip
从IA32_LSTAR
MSR
加载。即rcx
立即被摧毁syscall
。这就是为什么rcx
必须替换系统调用ABI的原因。
相同的syscall
指令也保存rflags
到中r11
,然后rflags
使用IA32_FMASK
MSR
进行掩码。这就是为什么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的调用。因为此程序是在旧内核上编译的,所以