x86 中 Linux 内核的lookup_address函数在调试页面错误的特定情况时返回NULL

问题描述 投票:0回答:1

我使用内核(通用)v6.1 在

arch/x86/mm/fault.c
中实现了一个简单的钩子函数。 这个函数是这样的:

void is_read_only(unsigned long addr)
{
    unsigned int level;
    pte_t *pte = lookup_address(addr, &level);
    if(pte == NULL)
        printk(KERN_WARNING "--------> Page not present");
    else if pte_write(*pte)
        printk(KERN_WARNING "--------> Page is writable");
    else
        printk(KERN_WARNING "--------> Page is readonly");
}

我在

__bad_area_nosemaphore
内部调用此函数,紧接在
show_signal_msg
调用下方。我将虚拟地址作为参数提供给
is_read_only

我使用过的一个众所周知的 Linux 页面错误 (PF)/分段错误示例是这样的:

#include <stdio.h>

char *str = "Hello, world!";

int main()
{
    printf("%s", str);
    str[0] = 'h';
    return 0;
}

此示例返回 错误代码 7,以下行在系统日志中生成:

segfault at 562642b30004 ip 0000562642b2f16d sp 00007fffb58ac2a0 error 7 in a.out[562642b2f000+1000] likely on CPU 0 (core 0, socket 0)

通过查阅Intel手册,原来错误代码7的意思是:

  • 位 0 开启,表示当 PF 发生时页面存在。
  • 位 1 亮起,表明发生 PF 时处理器处于用户模式。
  • Bit 2 亮,表示 PF 发生时处于写操作状态。

如果错误 7 意味着该页面存在,为什么

lookup_address
返回 NULL? 不是应该正确返回页表条目吗?

linux-kernel x86 segmentation-fault page-tables page-fault
1个回答
0
投票

如果可以的话请帮助我,我感觉很沮丧 我很感激你的圆润 帮助我重新站稳脚跟 请你帮帮我好吗?

© www.soinside.com 2019 - 2024. All rights reserved.