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

时间:2012-04-16 00:33:26

标签: c linux memory kernel semaphore

我正在尝试了解内核,并且一段时间以来一直尝试打印构成内核环境的一些基本数据结构。我的问题是,给定一个内存地址,我希望能够打印该地址的内容。

例如,我有一个确定IDT位置的函数。它会按(void *)的顺序返回0xffff81b8c0000fff。但是,每当我尝试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);

这是尝试此尝试后发生的内核恐慌的尾端:

enter image description here

我似乎需要一个信号量来进行读访问,但这不是一个任意的地址吗?

2 个答案:

答案 0 :(得分:5)

  

例如,我有一个确定IDT位置的函数。它以0xffff81b8c0000fff

的顺序返回(void *)

char*以外的任何指针都没有可能等于0x...ff - 该地址未正确对齐指向包含char以外的任何内容的数据结构的指针。

结论:您的sidt函数已损坏并返回虚假地址。

答案 1 :(得分:1)

我建议让kdb去寻找内核中的内容。

尝试使用kdb修补内核设置KVMqemu VM。