gpt4 book ai didi

c++ - C++ 中的相对地址与物理地址

转载 作者:行者123 更新时间:2023-12-02 09:55:56 24 4
gpt4 key购买 nike

最近开始学习内存管理,读到了相对地址和物理地址,脑子里出现了一个问题:

当我打印变量的地址时,它显示的是变量在内存中的相对(虚拟)地址还是物理地址?

还有一个关于内存管理的问题:

为什么这段代码每次运行都会产生相同的堆栈指针值(来自 Shellcoder 手册,第 28 页)?我运行的任何程序是否会生成此地址?

// find_start.c
unsigned long find_start(void)
{
__asm__("movl %esp, %eax");
}
int main()
{
printf("0x%x\n",find_start());
}

如果我们编译并运行几次,我们会得到:

shellcoders@debian:~/chapter_2$ ./find_start
0xbffffad8
shellcoders@debian:~/chapter_2$ ./find_start
0xbffffad8
shellcoders@debian:~/chapter_2$ ./find_start
0xbffffad8
shellcoders@debian:~/chapter_2$ ./find_start
0xbffffad8

如果有人可以向我澄清这个话题,我将不胜感激。

最佳答案

When I print a variable's address, is it showing the relative ( virtual ) address or the physical address in where the variable located in the memory ?

相对地址的对应部分是绝对地址。这与 virtual 之间的区别无关。和物理地址。

在大多数常见的现代操作系统上,例如 Windows、Linux 和 MacOS,除非您正在编写驱动程序,否则您永远不会遇到物理地址。这些由操作系统内部处理。您将仅使用虚拟地址。

Why does this code produces the same stack pointer value for each run ( from shellcoder's handbook , page 28) ?

在大多数现代操作系统上,每个进程都有自己的 virtual memory address space 。如果可能,可执行文件将加载到该虚拟地址空间中的首选基地址,否则将加载到另一个地址(重定位)。可执行文件的首选基地址通常存储在其 header 中。根据操作系统和 CPU,heap可能是在更高的地址创建的,因为堆通常向上增长(朝向更高的地址)。因为stack通常向下增长(朝向较低地址),它可能会在可执行文件的加载地址下方创建,并向地址 0 增长。

由于每次运行可执行文件时首选加载地址都是相同的,因此虚拟内存地址很可能是相同的。然而,如果address layout space randomization,这可能会改变。用来。另外,虚拟内存地址相同并不意味着物理内存地址也相同。

Does any program that I will run produce this address ?

根据您的操作系统,您可以在链接器设置中设置将程序加载到虚拟内存中的首选基地址。许多程序可能仍具有与您的程序相同的基地址,可能是因为这两个程序都是使用具有默认设置的相同链接器构建的。

The virtual addresses are only per program? Let's say I have 2 programs: program1 and program2. Can program2 access program1's memory?

program2 不可能直接访问program1 的内存,因为它们具有独立的虚拟内存地址空间。然而,一个程序可能会请求操作系统允许访问另一进程的地址空间。只要程序有足够的权限,操作系统通常会授予此权限。在 Windows 上,这可以通过函数 WriteProcessMemory 来完成。 。 Linux 通过使用 ptrace 提供类似的功能并写入/proc/[pid]/mem。请参阅this link欲了解更多信息。

关于c++ - C++ 中的相对地址与物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60154817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com