我正在尝试了解内核,并试图打印一些组成内核格局的基本数据结构的一些时间,但不成功。 我的问题是,给一个内存地址,我希望能够打印该地址的内容。
例如,我有一个决定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虚拟机。