Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 32位客户端调用64位内核模块时崩溃_Linux_Linux Kernel_Kernel_Compatibility - Fatal编程技术网

Linux 32位客户端调用64位内核模块时崩溃

Linux 32位客户端调用64位内核模块时崩溃,linux,linux-kernel,kernel,compatibility,Linux,Linux Kernel,Kernel,Compatibility,我已经编写了一个64位内核模块,它适用于64位应用程序,但在32位应用程序中崩溃。我需要弄清楚如何让模块检测客户端是否为32位应用程序,如果是,则管理模块中32位结构和64位结构之间的转换,以便系统调用正常工作 当模块由32位应用程序使用时,如果msg具有cmsghdr,则recvmsg()函数将崩溃,因为cmsghdr结构在32位应用程序中具有不同的大小 我的模块没有明确提供32位兼容层,即使内核配置为支持兼容模式下的32位应用程序 模块实现了一个新的协议,定义了struct proto_op

我已经编写了一个64位内核模块,它适用于64位应用程序,但在32位应用程序中崩溃。我需要弄清楚如何让模块检测客户端是否为32位应用程序,如果是,则管理模块中32位结构和64位结构之间的转换,以便系统调用正常工作

当模块由32位应用程序使用时,如果msg具有cmsghdr,则
recvmsg()
函数将崩溃,因为
cmsghdr
结构在32位应用程序中具有不同的大小

我的模块没有明确提供32位兼容层,即使内核配置为支持兼容模式下的32位应用程序

模块实现了一个新的协议,定义了
struct proto_ops
,但在proto ops中我没有看到
compat_recv


该模块充当客户端和另一个应用程序(64位)之间的代理,其中它使用
netlink
消息从后端获取对客户端请求的响应,而不是进行
\u sys\u socket*()
调用。

在协议操作中不需要compat\u recv。64位内核中对recvmsg的32位用户空间调用应该通过compat_sys_recvmsg,它设置MSG_CMSG_compat标志。该标志使uuuu sys_recvmsg()在回调到proto_操作和返回到用户空间之前进行必要的转换

引用(在内核树中):

  • 兼容性系统调用(通用)章节:/Documentation/adding-syscalls.txt
  • /net/compat.c
  • /net/socket.c
问候,,
Mateusz.

请看一下!就像现在这样,读起来绝对是一种恐怖!我编辑了你那篇非常难懂的文章和令人困惑的问题标题,让它更容易阅读,更容易理解。你应该努力学习提出更清晰的问题,因为你的问题被放在一个审查队列中,以查看是否有人想帮助解决这个被称为“低质量帖子”的问题。请审查我的更改,编辑你的答案,并纠正我可能犯的任何错误,确保问题是正确的。请注意,在我考虑了你的问题和你所说的每一部分之后,我能够在顶部介绍实际的基本问题,并减少了大小、措辞和格式,使其更易于阅读和理解。很抱歉格式不好。我会记下这一点,并在下一篇文章中加以改进。谢谢你的格式我打赌你得到了这个答案,因为当你的问题被仔细地、深思熟虑地构造并格式良好时,你的问题更容易理解。不是为了说明问题——只是为了让你感觉到它确实会带来不同,并帮助你得到你需要的答案。这是一个非常快速的答案,看起来是一个质量很好的答案。