在 Linux 内核中如何定义系统调用?compat_sys_xxx和sys_xxx之间有什么关系?



在/include/linux/pat.h中,我看到了很多的compat_sys_xxx。此外,还有在其他地方定义的sys_xxx。compat_sys_xxx和sys_xxx是什么关系?

如果有一个比较条目,这几乎肯定意味着系统调用原型被更改了,并且维护了先前原型的一个版本以保持兼容性。通常您会看到,compat_sys_xxx只是调用经过适当转换的参数后的sys_xxx(或者两者都调用一个转换稍有不同的通用函数)。

作为一个或多或少随机的例子,compat_sys_msgsnd接受三个"int"参数,后面跟着一个指向compat_msgbuf结构的指针(其中第一个字段(表面上是"long")强制为32位大小)。sys_msgsnd以不同的顺序列出参数,并选择参数类型以适应体系结构(即根据自然长整数大小的长浮点数,size_t取代int在一个地方,等等)。

毫无疑问,系统调用接口被改变了,因为当移动到不同的(非i386)体系结构时,原始接口在某种程度上是模糊的。compat_版本允许现有的二进制文件在不修改的情况下继续工作。

最新更新