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



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

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

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

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

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

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

参考文献(在内核树中):

    兼容性系统调用
  • (通用)章节:/文档/添加系统调用.txt
  • /
  • net/compat.c
  • /
  • net/socket.c

问候马特乌斯。

最新更新