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);

这是进行此尝试后发生的内核恐慌的结尾:

在此处输入图像描述

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

4

2 回答 2

5

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

没有指向其他任何东西的指针char*可能相等0x...ff——对于指向包含除chars 之外的任何数据结构的指针,该地址没有正确对齐。

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

于 2012-04-16T02:38:20.237 回答
1

我建议让kdb在内核中四处探索。

尝试设置带有 kdb 补丁内核的KVMqemu VM。

于 2012-04-16T03:26:42.523 回答