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

时间:2017-01-04 07:49:50

标签: linux linux-kernel kernel compatibility

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

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

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

该模块实现了一个新协议,定义了struct proto_ops,但我没有在原型操作中看到compat_recv

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

1 个答案:

答案 0 :(得分:3)

proto_ops中不需要compat_recv。在64位内核中调用recvmsg的32位用户空间应该通过compat_sys_recvmsg,它设置MSG_CMSG_COMPAT标志。该标志使___ sys_recvmsg()在回调到proto_ops之前和返回用户空间之前进行必要的转换。

引用(在内核树中):

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

此致 Mateusz。