我已经编写了一个64位内核模块,适用于64位应用程序,但是对于32位应用程序崩溃了。我需要弄清楚如何在客户端是32位应用程序时如何检测模块,如果是,则管理模块中32位结构和64位结构之间的转换,以便系统调用工作。
当32位应用程序使用该模块时,如果msg具有cmsghdrs,则recvmsg()
函数会崩溃,因为cmsghdr
结构在32位应用程序中具有不同的大小。
我的模块没有显式提供32位兼容层,即使内核配置为在兼容模式下支持32位应用程序。
该模块实现了一个新协议,定义了struct proto_ops
,但我没有在原型操作中看到compat_recv
。
该模块充当客户端与另一个应用程序(64位)之间的代理,其中它使用netlink
消息从后端获取对客户端请求的响应,而不是进行__sys_socket*()
调用。 / p>
答案 0 :(得分:3)
proto_ops中不需要compat_recv。在64位内核中调用recvmsg的32位用户空间应该通过compat_sys_recvmsg,它设置MSG_CMSG_COMPAT标志。该标志使___ sys_recvmsg()在回调到proto_ops之前和返回用户空间之前进行必要的转换。
引用(在内核树中):
此致 Mateusz。