C 在给定指针的情况下从内核中访问内核内存
我正在尝试了解内核,并且已经尝试了一段时间来打印一些组成内核环境的基本数据结构,但没有成功。我的问题是,给定一个内存地址,我希望能够打印该地址的内容 例如,我有一个函数确定IDT的位置。它以C 在给定指针的情况下从内核中访问内核内存,c,linux,memory,kernel,semaphore,C,Linux,Memory,Kernel,Semaphore,我正在尝试了解内核,并且已经尝试了一段时间来打印一些组成内核环境的基本数据结构,但没有成功。我的问题是,给定一个内存地址,我希望能够打印该地址的内容 例如,我有一个函数确定IDT的位置。它以0xffff81b8c0000fff的顺序返回(void*)。然而,每当我试图printk该地址是什么时,结果就是内核死机。我知道有一些保护措施可以防止人们从用户空间访问内核内存,但我正试图在start_内核中做到这一点,我本以为它们是可读的 代码是: idt_ptr = sidt(); // returns
0xffff81b8c0000fff
的顺序返回(void*)
。然而,每当我试图printk
该地址是什么时,结果就是内核死机。我知道有一些保护措施可以防止人们从用户空间访问内核内存,但我正试图在start_内核中做到这一点,我本以为它们是可读的
代码是:
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
s以外的任何对象的数据结构的指针,该地址没有正确对齐
结论:您的sidt
函数已损坏,并返回虚假地址。我建议尝试在内核内部进行探测
尝试使用kdb修补的内核设置一个或多个虚拟机。根据我在操作系统开发中的经验,这似乎是在触发页面错误。当您尝试访问不应该或不存在的分页内存时,就会发生这种情况。不幸的是,我不知道我能说什么来帮助你。根据其他地址,我想说实际地址可能是
0xffffffff81b8c000
,0x0fff
很可能是16位IDT限制。OP应该注意,sidt
opcode写入一个10字节的值,其中下两个字节是16位限制,上8个字节是地址。我担心可能是这样。我一直试图在userland中测试它,但因为我无论如何都无法访问内核内存,所以我无法判断我的地址是错误的还是无法访问它的内容。caf所说的很有道理,我将尽早尝试并汇报。谢谢