gpt4 book ai didi

linux - 64 位内核模块在被 32 位客户端调用时崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:14 25 4
gpt4 key购买 nike

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

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

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

该模块实现了一个新协议(protocol),定义了struct proto_ops,但我没有在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 和返回用户空间之前进行必要的转换。

引用资料(在内核树中):

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

问候,马特乌斯。

关于linux - 64 位内核模块在被 32 位客户端调用时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com