C 是否有方法转储所有物理内存值?

C 是否有方法转储所有物理内存值?,c,memory,assembly,C,Memory,Assembly,我知道每个用户进程都有一个虚拟地址空间,可以转储。但是有没有办法转储物理地址空间?假设我有32位系统和4GB内存,我可以写一个程序来打印每个物理内存位置 我知道它违反了内存保护等,但如果可能的话,如何将其转换为内核进程或更低级别的进程,以允许我访问整个内存 我想知道如何在Windows/Linux平台(或内核)上编写这样的代码(如果可能的话)。。或者,如果我必须使用汇编或类似的东西,如何转换到该特权级别。我可以编写一个程序来打印每个物理内存位置。 我认为没有操作系统允许用户访问物理内存位置。所以

我知道每个用户进程都有一个虚拟地址空间,可以转储。但是有没有办法转储物理地址空间?假设我有32位系统和4GB内存,我可以写一个程序来打印每个物理内存位置

我知道它违反了内存保护等,但如果可能的话,如何将其转换为内核进程或更低级别的进程,以允许我访问整个内存


我想知道如何在Windows/Linux平台(或内核)上编写这样的代码(如果可能的话)。。或者,如果我必须使用汇编或类似的东西,如何转换到该特权级别。

我可以编写一个程序来打印每个物理内存位置。


我认为没有操作系统允许用户访问物理内存位置。所以,你不能。您看到的是操作系统生成的虚拟地址。

在Windows上,可以直接访问物理内存。您可以做的一些事情:

  • 使用Device\PhysicalMemory对象--您不能访问所有物理内存,并且从Windows Server 2003 SP1开始,用户模式对它的访问受到限制
  • 使用地址窗口扩展——您可以控制自己的虚拟到物理地址映射,因此在某种意义上,您可以直接访问物理内存,尽管仍然是通过页表
  • 编写内核模式驱动程序——有内核模式API可以直接访问物理内存,分配物理内存页,等等。其中一个原因是DMA(直接内存访问)
这些方法都不能让您轻松、无限制地访问任何物理内存位置。
如果我可以问一下,你想做什么?

我想你可能可以用一个,但结果将是乱七八糟的,因为当你抓到它时,RAM的用户部分将是操作系统的页面,它可能是一个应用程序的一部分,也可能是一堆乱七八糟的东西。前一个SO问题可能也很有帮助:

在Linux中,您可以打开并映射设备文件
/dev/mem
(如果您具有读取权限)。这与物理内存相对应。

试试这个NTMIO-一个WINDOWS命令行来访问硬件资源

你可能可以(我个人从未尝试过),但它至少需要一些操作系统调用。用户进程无法访问物理内存。如果在代码中没有一种已知的方法可以做到这一点,那么你总是可以使操作系统崩溃并以这种方式获得内存转储。哈哈!知道如何使操作系统崩溃吗p这里有一些工具可以为您实现这一点,例如Sysinternals Notmyfault。您还可以配置注册表项,使系统在出现特定键盘组合时崩溃。相关链接windows命令行以访问硬件资源您可以,一个名为CheatEngine的程序执行此操作。它是开源的,我想你可以看看它是怎么做到的。