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

fro*_*uds 4 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);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

Emp*_*ian 5

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

没有指向除了char*可能相等之外的任何指针0x...ff- 该地址没有正确对齐指向包含除chars 之外的任何内容的数据结构的指针.

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

  • 根据其他地址,我想说真实地址可能是“0xffffffff81b8c000” - “0x0fff”很可能是 16 位 IDT 限制。OP 应注意“sidt”操作码写入 10 字节值,其中低两个字节是 16 位限制,高 8 字节是地址。 (2认同)