C / ++ / ASM-是否可以从0x0读取堆栈/堆大小和虚拟内存地址空间?

时间:2020-07-23 06:54:50

标签: c++ c assembly memory computer-science

据我所知,程序的0x0之类的内存地址是其代码段在其虚拟地址空间中的开头。是否可以简单地从程序中读取其中的内容?如何检查堆栈/堆的大小呢?如果在C / ++程序中无法实现,则可以在汇编中实现吗?

编辑:我发现内存分配和管理很有趣。我出于好奇而问。我喜欢能够查看程序的虚拟地址空间的每个地址中包含的内容的想法。当我提到堆栈/堆的大小时,我也指的是程序的大小。

1 个答案:

答案 0 :(得分:1)

首先,假设您正在运行Linux,请检查/proc/<pid>/maps。这将为您显示已分配区域的列表,以及每个区域的权限(从技术上来说是VMA)。签出this answer。权限是“ rwx”或其中的一部分,表示可读,可写和可执行。对于可读区域,您可以使用uintptr_t在C / C ++中制作一个指针。之后,您可以阅读它。

基本上,您可以使用简单的指针转储所有可读区域。

顺便说一句,实际上在所有 all C二进制文件中,将从地址0x0开始的区域未映射,因此使用NULL指针将导致SEGFAULT。

相关问题