linux - 如何检查内核空间中的地址是否可访问
问题描述
我正在开发内核实时补丁,实时补丁模块中的一些代码如下所示:
void list_checker() {
struct list_head *head, *iter;
head = (struct list_head *)kallsyms_lookup_name("module_name:symbol_name");
for (iter = head->next; iter != head; iter = iter->next) {
// do something.
}
}
此代码获取内核符号的地址(即 type struct list_head
)并尝试迭代列表。但是由于某些原因,链表中的某些节点可能会被破坏,导致next
某些节点的指针无效(如 NULL、0xABABABAB 或其他随机数),取消引用next
指针可能会导致内核崩溃。
那么有没有办法检查指针是否可以安全访问?
我检查了之前的两个答案:
如何判断虚拟地址在 ARM linux 内核中是否具有有效映射?
他们告诉我使用virt_addr_valid
. 我有一些肯定可以访问的地址,例如 0xFFFFFFFFA032C040,但virt_addr_valid
总是返回 false,这使我无法区分实时补丁模块中的“可访问”和“不可访问”地址。
解决方案
推荐阅读
- java - 有没有办法在春天重新加载自动装配的实例或替换自动装配的行为
- apache-spark - 设计- Kafka Producer 可以写成 Spark-job 吗?
- sql - 如何避免在 Excel 中以明文形式存储数据库密码?
- rhel7 - RHEL7 yum 更新依赖问题
- javascript - 如何定位具有选定值的选择选项
- php - 通过 API 操作调用时如何在 CakePHP 控制器 requestAction 方法中发布数据?
- css - 当元素中还有另一个类时,SCSS 扩展类
- qt - 如何填充 QLineSeries 线和 X 轴之间的部分?
- javascript - 即使多个值发生变化,如何只调用一次观察组中的数据?
- android - 使用 mockito 在 android(kotlin) 中为交互者/演示者制作 junit 测试用例