2012-04-16 138 views
4

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

例如,我有一个函数来确定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

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

+0

从我在操作系统开发方面的经验来看,好像是触发了页面错误。当您尝试访问您不应该或不存在的分页内存时,会发生这种情况。不幸的是,我不知道更多我可以说帮助你。 – user99545 2012-04-16 02:33:59

回答

5

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

没有指针的顺序返回(无效*)比其他任何char*可能可能等于0x...ff - 该地址没有被正确的指向包含比char S以外的任何一个数据结构对齐。

结论:您的sidt功能被破坏并返回虚假地址。

+1

根据其他地址,我会说实际地址可能是0xffffffff81b8c000 - 0x0fff很可能是16位IDT限制。 OP应该注意'sidt'操作码写入一个10字节的值,其中较低的两个字节是16位限制,高8字节是地址。 – caf 2012-04-16 07:15:04

+0

我担心这可能是这种情况。我一直试图在userland进行测试,但由于无法访问内核内存,我无法判断我的地址是否坏,或者我无法访问它的内容。说什么咖啡很有意义,我会尽早尝试并报告。谢谢。 – fromClouds 2012-04-16 15:26:34

1

我建议给kdb一个在内核周围打个盹。

尝试设置一个KVMqemu具有kdb修补内核的虚拟机。

+0

我会研究它,谢谢你的建议。 – fromClouds 2012-04-16 15:27:22