【发布时间】:2014-06-19 09:45:42
【问题描述】:
在/include/linux/compat.h 中,我看到很多compat_sys_xxx。此外,在其他地方定义了 sys_xxx。 compat_sys_xxx 和 sys_xxx 是什么关系?
【问题讨论】:
标签: linux linux-kernel system-calls
在/include/linux/compat.h 中,我看到很多compat_sys_xxx。此外,在其他地方定义了 sys_xxx。 compat_sys_xxx 和 sys_xxx 是什么关系?
【问题讨论】:
标签: linux linux-kernel system-calls
如果有 compat 条目,这几乎可以肯定意味着系统调用原型已更改,并且为了兼容性而维护了先前原型的版本。通常你会看到 compat_sys_xxx 只是调用 sys_xxx 并适当转换了参数(或者两者都调用了一个转换略有不同的通用函数)。
作为一个或多或少随机的示例,compat_sys_msgsnd 采用三个“int”参数,后跟一个指向 compat_msgbuf 结构的指针(其中第一个 - 表面上是“long” - 字段被强制为 32 位大小)。 OTOH,sys_msgsnd 以不同的顺序列出参数,并选择参数类型以针对架构进行适当的变形(即,根据自然长整数大小的长浮点数,size_t 在一个位置替换 int,等等)。
毫无疑问,系统调用接口已更改,因为原始接口在移动到不同的(非 i386)架构时在某种程度上是模棱两可的。 compat_ 版本允许现有的二进制文件无需修改即可继续工作。
【讨论】: