【发布时间】: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