c - 直接访问进程内存

标签 c memory-management virtual-memory

简单的问题:

直接访问我的程序的虚拟内存是否可能,以及如何可能?

具体来说, 而不是打字

int someValue = 5;

我可以做这样的事情吗:

VirtualMemory[0x0] = (int)5;

我只是问,因为我希望将值彼此相邻存储以获得一个漂亮而小的内存映射。

当我研究汇编程序基础知识时,处理器直接一个接一个地存储值,我想知道如何在 c 中这样做。

感谢您的所有回复。

干杯,

幸运

最佳答案

不完全是,因为在源代码中你不知道你的程序将被“加载到”哪个内存地址。所以程序中的所有内存地址都以“从程序开始的偏移量”类型的方式编码。

“进程加载器”将程序复制到内存中的部分职责是将“基本偏移指针”添加到所有其他偏移量,因此所有描述内存地址的“名称”都指的是实际内存地址,而不是“从程序开始的偏移量”。

这通常是一件好事,就好像它们是直接编码的一样,两个需要同一组地址的程序不能同时运行而不会破坏彼此的共享内存。此外,将程序加载到不同的起始地址是不可能的,因为走出程序的内存(如果您在不重写内存地址引用的情况下重新定位程序,几乎可以保证)将在操作系统的内存中引发段错误内存管理监视器。

您还需要一个名称作为开头,这意味着偏移量绑定(bind)到变量名称。通常,根据分配的项目在堆中四处搜寻比真正找到加载到内存中的程序的开始要容易得多(因为 C 编程语言并没有真正将该地址捕获到一个 in - 语言变量名称,布局在某种程度上取决于系统)。

关于c - 直接访问进程内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935144/

相关文章:

memory-management - 为什么具有 12 位偏移量的 16 位地址会导致 4KB 的页面大小?

java - 让 JVM 根据需要增加内存需求,直到达到 VM 限制的大小?

c - 13.1.4 之前的 LXVD2X 是否有内置的 XL C?

代码正在跳过程序中的命令。 (C)

cpu - 分页的地址转换会降低内存访问性能吗?

objective-c - 崩溃日志的含义-[__ NSCFString substringWithRange:]

objective-c - 保留 iOS setter 方法中的发布惯例

c - 指针定义中的双星

java - 将 Java 代码翻译为 C

c++ - 如果第一次失败,重新尝试内存分配?