我使用内核(通用)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的意思是:
如果错误 7 意味着该页面存在,为什么
lookup_address
返回 NULL?
不是应该正确返回页表条目吗?
如果可以的话请帮助我,我感觉很沮丧 我很感激你的圆润 帮助我重新站稳脚跟 请你帮帮我好吗?