【问题标题】:64-bit kernel module crashing when called by 32-bit client64 位内核模块在被 32 位客户端调用时崩溃
【发布时间】:2017-01-04 07:49:50
【问题描述】:

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

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

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

模块实现了一个新协议,定义了struct proto_ops,但我在proto ops中没有看到compat_recv

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

【问题讨论】:

  • 请看formatting help!就目前而言,阅读起来绝对令人恐惧!
  • 我编辑了您非常不清楚难以阅读的帖子和令人困惑的问题标题,以使其更易于阅读和更快地理解。您应该努力学习提出更清晰的问题,因为您的问题已被列入审核队列,以查看是否有人愿意帮助解决被称为“低质量帖子”的问题。
  • 请检查我的更改并编辑您的答案并修正我可能犯的任何错误并确保问题正确。请注意,在我考虑了你的问题和你所说的每一部分之后,我能够在顶部介绍实际的基本问题,并减少大小、措辞、格式,使其阅读速度更快、理解更清晰.
  • 很抱歉格式不正确。会记下这一点,并将在我的下一篇文章中改进。感谢格式化

标签: linux linux-kernel kernel compatibility


【解决方案1】:

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

引用(在内核树中):

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

问候, 马特乌斯。

【讨论】:

  • 我敢打赌,您会得到这个答案,因为当您的问题经过仔细和深思熟虑的构造和格式设置时,它会更容易理解。不赘述这一点——只是为了帮助您了解它确实会产生影响并帮助您获得所需的答案。这是一个非常快速的答案,看起来质量不错。
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 2012-02-16
  • 2020-03-17
  • 2011-12-04
  • 1970-01-01
  • 2016-03-14
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多