我有点失望,几乎没有讨论过这件事,不管我看在哪里,所以我想我得问一问。
我正在编写一个跨平台内存工作台标记应用程序,它需要直接的物理地址映射而不是虚拟地址。
编辑解决方案类似于Linux/Unix系统调用:
int fd = open("/dev/mem", O_RDONLY);
mmap(NULL, len, PROT_READ, MAP_SHARED, fd, PHYSICAL_ADDRESS_OFFSET);这将要求内核要么为您提供一个虚拟页面映射到所需的物理地址,要么返回它失败的消息。这确实需要主管特权,但没关系。
我已经看到了很多关于共享内存和内存映射文件的信息,但是所有这些都驻留在磁盘上,因此,当我试图使系统依赖于读取时,这些信息并不真正有用。这与编写IO驱动程序非常相似,尽管我不需要将权限写入物理地址。
本网站提供了一个示例,说明如何使用Windows驱动程序工具包在驱动程序级别执行此操作:
NT内部:在驱动程序和应用程序之间共享内存
此解决方案可能需要Visual,而我目前无法访问Visual。(我下载了WDK api,但它抱怨我在Windows上使用GCC )。
我传统上是一个Linux程序员,所以我希望可能有一些非常简单的东西我错过了。如果你知道一些我不知道的事情,请提前感谢!
发布于 2012-07-10 19:59:27
我不认为你对MAP_FIXED的理解是正确的。这告诉内核将映射的内存放在进程地址空间中给定的虚拟地址上。用户模式进程总是使用虚拟寻址。简而言之,我认为在Windows或任何Unix或Linux版本中,您都无法满足自己的要求。
发布于 2012-07-10 20:14:57
对于用户空间应用程序的物理内存映射讨论不多的原因是用户空间应用程序无法获得物理内存映射。在用户空间中运行的部分定义是,您是在一个虚拟地址空间中运行的,这个虚拟地址空间是进程的私有空间。
使用MAP_FIXED的mmap只允许您告诉系统将内存放在进程地址空间中的位置。换句话说,您可以指定内存将显示的虚拟地址。这不是任何形式或形式的物理地址。
https://softwareengineering.stackexchange.com/questions/156311
复制相似问题