3

有没有办法打印出操作系统可以在 C 中寻址的最低和最高内存地址?

4

5 回答 5

3

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

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

根据您的评论:

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

这再次取决于操作系统。您的地址空间不一定是您拥有的物理内存,而是您可以寻址的所有位置。例如,基于 x86 的操作系统可能会为每个进程提供其自己的 4G 地址空间,但您必须要求操作系统提供“支持”内存(放入该地址空间的实际真实内存)。

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

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

于 2009-11-06T23:19:37.873 回答
3

/proc/[PID]/maps在 Linux 上,您可以通过查看;来询问任何正在运行的进程的内存映射。参见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。

于 2009-11-07T00:07:40.367 回答
3

The simple answer is that on a 32-bit address system (for example), the address range is [0x00000000, 0xFFFFFFFF]. But that does not mean you can actually access every byte within that range. You need to know how the operating system and compiler arrange the memory within your program, i.e., where the static data segment is, where the heap is, where the stack is, etc.

And realize than on any given program running on a modern operating system, most of the address space is unmapped.

With virtual memory, every process has its own address space, so that the byte at address 0x0010F444 (for example) in one process is a completely different physical byte than the byte at the same address in every other process.

于 2009-11-07T02:45:17.107 回答
0

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

于 2009-11-07T00:08:27.853 回答
0

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

我建议可能会有所帮助,至少给你一些方向。另一件事是 brk(2) / sbrk(2)。这些机制并不像我的经验显示的那样经常使用。

于 2009-11-07T00:49:17.997 回答