c中的最低和最高内存地址?

时间:2009-11-06 23:17:20

标签: c memory-address

有没有办法打印出操作系统可以在c?

中寻址的最低和最高内存地址

5 个答案:

答案 0 :(得分:3)

不,这不是标准C的功能。您需要的任何解决方案都需要特定于操作系统。

如果你有一些特定的操作系统,你应该提到它们。但我很难想知道为什么这很重要。它不需要能够编写C程序,所以也许你可以启发我们。

根据您的评论:

  

我很好奇的是“如果每个进程在内存中获得一个地址空间,我是否可以打印出该进程的顶部地址和底部地址?”

这又取决于操作系统。您的地址空间不一定是您拥有的物理内存,而是您可以解决的全部位置。例如,基于x86的操作系统可能会为每个进程提供自己的4G地址空间,但您必须要求操作系统“备份”内存(实际的实际内存放在该地址空间中)。

其中一些地址空间实际上是在所有进程之间共享的(例如,操作系统可以加载其代码的一个物理副本以供所有进程使用)。

你必须记住虚拟内存和物理内存是非常不同的野兽。

答案 1 :(得分:3)

在Linux上,您可以通过查看/proc/[PID]/maps来查询任何正在运行的进程的内存映射;见proc(5)。例如:

$ cat /proc/self/maps
08048000-0804f000 r-xp 00000000 03:01 63119      /bin/cat
0804f000-08050000 rw-p 00006000 03:01 63119      /bin/cat
08050000-08071000 rw-p 08050000 00:00 0          [heap]
b7c58000-b7e09000 r--p 00000000 03:05 243564     /usr/lib/locale/locale-archive
b7e09000-b7e0a000 rw-p b7e09000 00:00 0
b7e0a000-b7f39000 r-xp 00000000 03:01 63497      /lib/libc-2.7.so
b7f39000-b7f3a000 r--p 0012f000 03:01 63497      /lib/libc-2.7.so
b7f3a000-b7f3c000 rw-p 00130000 03:01 63497      /lib/libc-2.7.so
b7f3c000-b7f40000 rw-p b7f3c000 00:00 0
b7f5b000-b7f5c000 rw-p b7f5b000 00:00 0
b7f5c000-b7f76000 r-xp 00000000 03:01 63276      /lib/ld-2.7.so
b7f76000-b7f78000 rw-p 00019000 03:01 63276      /lib/ld-2.7.so
bfc83000-bfc98000 rw-p bffeb000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]

对于此过程,内存映射中的最后一个条目是0xfffff000,因此最后一个可寻址字节是0xfffff000 - 1.

答案 2 :(得分:3)

简单的答案是,在32位地址系统(例如)上,地址范围为[0x00000000, 0xFFFFFFFF]。但这并不意味着您实际上可以访问该范围内的每个字节。您需要知道操作系统和编译器如何在程序中排列内存,即静态数据段的位置,堆的位置,堆栈的位置等。

并且认识到在现代操作系统上运行的任何给定程序,大部分地址空间都是未映射的。

对于虚拟内存,每个进程都有自己的地址空间,因此一个进程中地址0x0010F444处的字节(例如)与每个其他进程中同一地址处的字节完全不同

答案 3 :(得分:0)

在具有虚拟内存和内存保护的现代操作系统上,进程的地址空间的边界不是静态的。当您从堆中分配内存时,操作系统可以将更多物理内存映射到您的地址空间,从而导致该空间增长。

答案 4 :(得分:0)

这里最重要的是进程内存和操作系统内存完全不同的东西。所以说“在C中”你真的是指与进程内存空间不同的东西吗?

我建议this可以提供帮助,至少可以给你一些指导。 另一件事是brk(2)/ sbrk(2)。我的经验表明,这些机制并不经常使用。