64 位内核模块在被 32 位客户端调用时崩溃
64-bit kernel module crashing when called by 32-bit client
我编写了一个 64 位内核模块,它适用于 64 位应用程序,但适用于 32 位应用程序。我需要弄清楚如何让模块检测客户端是否是 32 位应用程序,如果是,则管理模块中 32 位结构和 64 位结构之间的转换,以便系统调用工作。
当模块被 32 位应用程序使用时,如果 msg 有 cmsghdrs,recvmsg()
函数会崩溃,因为 cmsghdr
结构在 32 位应用程序中具有不同的大小。
我的模块没有明确提供 32 位兼容层,即使内核配置为在兼容模式下支持 32 位应用程序。
该模块实现了一个新协议,定义了 struct proto_ops
,但我在协议操作中没有看到 compat_recv
。
该模块充当客户端和另一个应用程序(64 位)之间的代理,其中它使用 netlink
消息而不是进行 __sys_socket*()
调用从后端获取对客户端请求的响应.
compat_recv 在 proto_ops 中不需要。在 64 位内核中对 recvmsg 的 32 位用户空间调用应该通过设置 MSG_CMSG_COMPAT 标志的 compat_sys_recvmsg。该标志使 ___sys_recvmsg() 在回调到您的 proto_ops 和返回用户空间之前进行必要的转换。
参考文献(在内核树中):
- 兼容性系统调用(通用)章节:/Documentation/adding-syscalls.txt
- /net/compat.c
- /net/socket.c
此致,
马特乌斯
我编写了一个 64 位内核模块,它适用于 64 位应用程序,但适用于 32 位应用程序。我需要弄清楚如何让模块检测客户端是否是 32 位应用程序,如果是,则管理模块中 32 位结构和 64 位结构之间的转换,以便系统调用工作。
当模块被 32 位应用程序使用时,如果 msg 有 cmsghdrs,recvmsg()
函数会崩溃,因为 cmsghdr
结构在 32 位应用程序中具有不同的大小。
我的模块没有明确提供 32 位兼容层,即使内核配置为在兼容模式下支持 32 位应用程序。
该模块实现了一个新协议,定义了 struct proto_ops
,但我在协议操作中没有看到 compat_recv
。
该模块充当客户端和另一个应用程序(64 位)之间的代理,其中它使用 netlink
消息而不是进行 __sys_socket*()
调用从后端获取对客户端请求的响应.
compat_recv 在 proto_ops 中不需要。在 64 位内核中对 recvmsg 的 32 位用户空间调用应该通过设置 MSG_CMSG_COMPAT 标志的 compat_sys_recvmsg。该标志使 ___sys_recvmsg() 在回调到您的 proto_ops 和返回用户空间之前进行必要的转换。
参考文献(在内核树中):
- 兼容性系统调用(通用)章节:/Documentation/adding-syscalls.txt
- /net/compat.c
- /net/socket.c
此致, 马特乌斯