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

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

例如,所讨论的结构体的当前地址是物理地址:0x3f5e16000

现在我最初尝试通过使用指向/ dev / mem的指针访问此地址。 不过,我已经知道,访问任何地址> 1024MB是不允许的,我得到一个很好的错误消息在var / log / messages告诉我所有关于它。 目前正在尝试从一个用户空间的应用程序访问,但我很高兴看到编写一个内核模块,如果这是需要的。

有趣的是,我还发现了一种被称为“kprobe”的东西,它可以让1024MB / dev / mem的限制被绕过。 但是,我并不想将任何潜在的安全问题引入到我的系统中,我相信必须有一个更简单的方法来实现这一点。 有关kprobe的信息可以在这里find: http : //www.libcrack.so/2012/09/02/bypassing-devmem_is_allowed-with-kprobes/

我已经做了一些阅读,我已经find了使用mmap将物理地址映射到用户空间以便可以读取的参考,但是我必须承认我不了解C中的这个实现。

如果任何人都可以提供有关访问物理内存的信息,或者将数据从物理地址映射到用户空间的虚拟地址,我将非常感激。

如果我对于自己的工作有些模糊,你将不得不原谅我,但是这是项目的一部分,我不想给太多的信息,所以请耐心等待:)我不是愚蠢的或任何东西。

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

我使用的地址绝对是一个物理地址,它被设置为非分页,内核模块执行翻译到物理,我不使用的地址,运营商。

我想知道如果我应该只是重新说明如何从物理位置读取一个int的问题,因为这是结构的第一个元素。 我希望有助于澄清事情!

编辑 – 在做了更多的阅读之后,似乎解决这个问题的一个可能的方法是构build一个内核模块,然后使用mmap函数将物理地址映射到内核模块可以访问的虚拟地址。 任何人都可以提供任何build议,使用mmap实现这一点?

我只想回答这个问题:

我想知道如果我应该只是重新说明如何从物理位置读取一个int的问题,因为这是结构的第一个元素。

不。问题不是intstruct ,问题是C in本身没有物理内存的概念。 OS和MMU一起确保每个进程(包括每个正在运行的C程序)运行在虚拟内存沙箱中。 操作系统可能会提供一个逃离物理内存的机会。

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

如果你试图与一个设计不好的内核模块进行通信,这个内核模块希望你访问一个固定的物理内存地址,那么涉及/dev/mem丑陋的黑客就是你的共享。