Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在给定指针的情况下从内核中访问内核内存_C_Linux_Memory_Kernel_Semaphore - Fatal编程技术网

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

C 在给定指针的情况下从内核中访问内核内存,c,linux,memory,kernel,semaphore,C,Linux,Memory,Kernel,Semaphore,我正在尝试了解内核,并且已经尝试了一段时间来打印一些组成内核环境的基本数据结构,但没有成功。我的问题是,给定一个内存地址,我希望能够打印该地址的内容 例如,我有一个函数确定IDT的位置。它以0xffff81b8c0000fff的顺序返回(void*)。然而,每当我试图printk该地址是什么时,结果就是内核死机。我知道有一些保护措施可以防止人们从用户空间访问内核内存,但我正试图在start_内核中做到这一点,我本以为它们是可读的 代码是: idt_ptr = sidt(); // returns

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

例如,我有一个函数确定IDT的位置。它以
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所说的很有道理,我将尽早尝试并汇报。谢谢