在给定指针的情况下从内核访问内核内存

我正在尝试了解内核,并试图打印一些组成内核格局的基本数据结构的一些时间,但不成功。 我的问题是,给一个内存地址,我希望能够打印该地址的内容。

例如,我有一个决定IDT位置的函数。 它按照0xffff81b8c0000fff的顺序返回(void *) 。 但是,每当我尝试printk该地址的内容时,结果都是内核恐慌。 我知道有防止从用户空间访问内核内存的保护措施,但我正试图从start_kernel内部执行此操作,在那里我会认为它们是可读的。

代码是:

 idt_ptr = sidt(); // returns (void *) printk(KERN_INFO "680: IDT TABLE, FIRST ENTRY\n"); //entry is 64 bits printk(KERN_INFO "680: %llx\n", *(unsigned long long *)idt_ptr); 

下面是进行这个尝试后发生的内核恐慌的尾端:

在这里输入图像描述

看来我需要一个信号量读取访问,但是这不是一个任意的地址?

例如,我有一个决定IDT位置的函数。 它按照0xffff81b8c0000fff的顺序返回(void *)

没有指向除char*之外的其他任何指针都可能等于0x...ff – 指向包含除char以外的任何数据结构的指针时,该地址未正确对齐。

结论:你的sidt函数被破坏并返回伪造的地址。

我建议给kdb一个在内核周围戳一下。

尝试使用kdb补丁内核设置KVM或qemu虚拟机。