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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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 - Fatal编程技术网

从C中的物理内存地址读取结构

从C中的物理内存地址读取结构,c,linux,memory,C,Linux,Memory,这可能是我缺乏C语言知识的问题,但我希望有人能提供一个可能的解决方案。简而言之,我试图读取存储在内存中的结构,我有它的物理内存地址。这也是在64位Linux系统(Debian(Wheezy)内核3.6.6)上完成的,我想使用C作为语言 例如,所述结构的当前地址位于物理地址:0x3f5e16000 现在,我确实尝试使用指向/dev/mem的指针访问这个地址。然而,我后来了解到,访问任何大于1024MB的地址都是不允许的,我在var/log/messages中得到了一条很好的错误消息,告诉了我这一切

这可能是我缺乏C语言知识的问题,但我希望有人能提供一个可能的解决方案。简而言之,我试图读取存储在内存中的结构,我有它的物理内存地址。这也是在64位Linux系统(Debian(Wheezy)内核3.6.6)上完成的,我想使用C作为语言

例如,所述结构的当前地址位于物理地址:0x3f5e16000

现在,我确实尝试使用指向/dev/mem的指针访问这个地址。然而,我后来了解到,访问任何大于1024MB的地址都是不允许的,我在var/log/messages中得到了一条很好的错误消息,告诉了我这一切。目前正在尝试从用户空间应用程序进行访问,但如果需要的话,我非常乐意研究编写内核模块

有趣的是,我还发现了一个称为“kprobe”的东西,它应该允许绕过>1024MB/dev/mem限制。然而,我真的不想在我的系统中引入任何潜在的安全问题,我相信一定有更简单的方法来实现这一点。有关kprobe的信息可在此处找到:

我读了一些书,找到了使用mmap将物理地址映射到用户空间以便可以读取的参考资料,但我必须承认,我不理解在C中的实现

如果有人能提供一些关于访问物理内存的信息,或者将数据从物理地址映射到用户空间虚拟地址的信息,我将不胜感激

如果我对自己正在做的事情有点含糊不清,你必须原谅我,但这是一个项目的一部分,我不想透露太多信息,所以请容忍我:)我不是迟钝或什么的

内存中的结构是由四个整数和十个长整数组成的块,由运行的内核模块加载到内存中

我使用的地址肯定是一个物理地址,它被设置为非分页,内核模块执行到物理的转换,我没有使用操作符的地址

我想知道我是否应该将这个问题重新表述为如何从物理位置读取int,因为这是结构的第一个元素。我希望这有助于澄清问题


编辑-在进一步阅读之后,似乎该问题的一个可能解决方案是构造一个内核模块,然后使用
mmap
函数将物理地址映射到内核模块可以访问的虚拟地址。有人能就使用mmap实现这一目标提供一些建议吗?

我只想回答这个问题:

我想知道我是否应该将这个问题重新表述为如何从物理位置读取int,因为这是结构的第一个元素

不。问题不在于
int
struct
相比,问题在于C本身没有物理内存的概念。操作系统与MMU一起确保每个进程(包括每个正在运行的C程序)都在虚拟内存沙箱中运行。操作系统可能会为物理内存提供一个转义窗口

如果您正在编写一个内核模块来管理物理地址
0x3f5e16000
处的某个对象,那么您应该提供一些API来访问该内存,最好是使用一个文件描述符或其他抽象来隐藏内核内存管理的本质,不让与之通信的用户程序知道


如果您试图与一个设计拙劣的内核模块进行通信,该模块希望您访问一个固定的物理内存地址,那么涉及
/dev/mem
的难看的黑客就是您的一部分。

我只想回答这个问题:

我想知道我是否应该将这个问题重新表述为如何从物理位置读取int,因为这是结构的第一个元素

不。问题不在于
int
struct
相比,问题在于C本身没有物理内存的概念。操作系统与MMU一起确保每个进程(包括每个正在运行的C程序)都在虚拟内存沙箱中运行。操作系统可能会为物理内存提供一个转义窗口

如果您正在编写一个内核模块来管理物理地址
0x3f5e16000
处的某个对象,那么您应该提供一些API来访问该内存,最好是使用一个文件描述符或其他抽象来隐藏内核内存管理的本质,不让与之通信的用户程序知道


如果您试图与一个设计拙劣的内核模块通信,而该模块希望您访问一个固定的物理内存地址,那么涉及
/dev/mem
的难看的黑客就是您的一部分。

您到底想做什么?也就是说,您试图访问的设备的结构是什么?您从操作员
&
的地址中获得的地址不是物理地址,而是虚拟地址,仅对正在运行的进程有效。它们在实际物理内存中的位置与您在程序中的地址无关,如果已交换到磁盘,它甚至可能不在物理内存中。
/dev/mem
地址物理内存,您确定这是您想要的,而不是虚拟内存吗?您如何知道它的物理地址?你在做驱动程序/内核工作吗?是的,目前我正在使用一个内核模块,它使用物理地址将某些数据结构和变量加载到内存中。你到底在做什么?也就是说,您试图访问的设备的结构是什么?您从操作员
&
的地址中获得的地址不是物理地址,而是虚拟地址,仅对正在运行的进程有效。它们在真实物理内存中的实际位置与你的地址无关