首页 > 解决方案 > 如何检查内核空间中的地址是否可访问

问题描述

我正在开发内核实时补丁,实时补丁模块中的一些代码如下所示:

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指针可能会导致内核崩溃。

那么有没有办法检查指针是否可以安全访问?

我检查了之前的两个答案:

如何在 Linux 内核中检查内存地址是否有效?

如何判断虚拟地址在 ARM linux 内核中是否具有有效映射?

他们告诉我使用virt_addr_valid. 我有一些肯定可以访问的地址,例如 0xFFFFFFFFA032C040,但virt_addr_valid总是返回 false,这使我无法区分实时补丁模块中的“可访问”和“不可访问”地址。

标签: linuxmemory-managementlinux-kernelpatchkernel-module

解决方案


如此处所述,kallsyms_lookup_name()提出了一些许可问题,并且它未在当前内核上导出。

您可能需要检查livepatch


推荐阅读