微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux 内核显示“WARNING: at arch/x86/mm/pageattr.c:962 change_page_attr_set_clr”而没有解释

如何解决Linux 内核显示“WARNING: at arch/x86/mm/pageattr.c:962 change_page_attr_set_clr”而没有解释

我正在编写一个针对 Linux v3-v4 的 x86_64 内核模块,它在内核符号的地址上使用 set_memory_rw()。虽然通话正常,但我收到了一条没有任何解释的警告:

[  596.183643] ------------[ cut here ]------------
[  596.183667] WARNING: at arch/x86/mm/pageattr.c:962 change_page_attr_set_clr+0x2ca/0x450()

以前我使用不同的方法,先调用 virt_to_page(),然后调用 set_pages_rw()。然而,正如内核源代码所说,这是一个已弃用的 API,它建议使用 set_memory_rw() 代替

这些 API 应被视为已弃用,并且可能会 将来被删除。 [...] 具体来说,旧 API 的许多用户都有一个虚拟地址, 在该地址上调用 virt_to_page() 或 vmalloc_to_page() 以 获取旧 API 所需的结构页面*。 要转换这些情况,请在原始情况下使用 set_memory_*() 虚拟地址,不要使用这些函数

谁能解释一下这里的问题是什么?
我想我正在绊倒 this check,这表明我可以添加 *addr &= PAGE_MASK;,但我不想盲目地这样做。

解决方法

我想我正在绊倒这个检查,这表明我可以添加 *addr &= PAGE_MASK;但我不想盲目去做。

对我来说听起来不错(这极有可能是“地址与页面边界不对齐”的问题;而且极有可能不想盲目地这样做是个好主意)。

可能的情况是您有一系列您关心的地址(而不是一系列页面);这就是你解决这个问题的方式。这意味着:

a) 计算 numpages 时要小心(例如,原始范围可能类似于“4 个字节,在一页的末尾有 2 个字节,在下一页的开头有 2 个字节” )。正确的方法是将“起始地址”向下舍入(pg = start_address & PAGE_MASK;),将“结束地址”向上舍入(end_page = ((start_address + size_in_bytes - 1) | ~PAGE_MASK) + 1;),然后计算页数(numpages = end_page - pg)。

b) 同一页面中可能还有其他您不希望使用新页面属性的内容。如果是这种情况,那么您就有一个基本的设计问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?