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

有帮助吗?

解决方案

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

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

根据您的评论:

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

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

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

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

其他提示

在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。

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

并实现比在现代操作系统上运行的任何给定程序,大多数地址空间都是未限定的。

使用虚拟内存,每个过程都有自己的地址空间,因此字节在地址 0x0010F444 (例如)在一个过程中,在其他每个过程中的相同地址的字节中是一个完全不同的物理字节。

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

这里最重要的是过程内存和操作系统内存是完全不同的事情。因此,说“在C”中,您真的是说与过程内存空间不同吗?

我建议 这个 可以帮助您,至少给您一些方向。另一件事是BRK(2) / SBRK(2)。这些机制并不经常像我的经验节目那样经常使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top