有没有办法打印出操作系统可以在c?
中寻址的最低和最高内存地址答案 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)。我的经验表明,这些机制并不经常使用。