2009-11-06 50 views
3

有沒有辦法打印出操作系統可以在c中處理的最低和最高內存地址?c中的最低和最高內存地址?

+2

我認爲,如果通過添加要找到該問題的答案來嘗試完成的任務來澄清問題,則可能更容易回答「否」之外的任何內容。瞭解您的流程可以從堆中分配多少?能夠將更廣泛的指針值分類爲無效,以進行調試?提供更多關於你的環境的背景信息會有所幫助。 – 2009-11-06 23:24:33

+0

你想知道計算機有多少物理內存?請記住,並非所有物理內存地址都映射到RAM。有些映射到ROM,有些映射到I/O區域,有些映射到任何地方。這取決於您的操作系統,處理器(32或64位?),主板,硬件,系統配置等等。 - 非常複雜的問題,您的問題太模糊。 – Artelius 2009-11-06 23:27:24

+1

最低? '0'。最高? 'wc -c/dev/mem | perl -le'printf(「%x \ n」,<>)''Muahahahahah! ;) – 2009-11-06 23:32:32

回答

3

不,這不是標準C的功能。無論您需要哪種解決方案都需要特定於操作系統。

如果你有一些特定的操作系統,你應該提及它們。但我很難想,爲什麼這很重要。不需要編寫C程序,所以也許你可以啓發我們。

基於您的評論:

我很好奇,是「如果每個進程在內存中得到的地址空間,我可以能夠打印出該進程的頂部地址和底部地址?」

這又取決於操作系統。您的地址空間不一定是您擁有的物理內存,而是您可以解決的全部位置。例如,基於x86的操作系統可能會爲每個進程提供自己的4G地址空間,但您必須向操作系統請求「支持」內存(將實際內存放入該地址空間)。

而且其中一些地址空間實際上是在所有進程之間共享的(例如,操作系統可以加載其代碼的一個物理副本以供所有進程使用)。

你必須記住,虛擬內存和物理內存是非常不同的野獸。

+0

謝謝,我明白了。 – root 2009-11-07 00:14:45

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

0

在有虛擬內存和內存保護,現代操作系統進程地址空間的邊界不是靜態的。從堆中分配內存時,可以通過操作系統將更多物理內存映射到地址空間來實現,從而導致該空間增大。

0

這裏最重要的是進程內存和操作系統內存是完全不同的東西。所以說「在C中」,你是否真的意味着與進程內存空間不同?

我建議this可以幫助,至少給你一些方向。 另一件事是brk(2)/ sbrk(2)。這些機制並不經常用於我的經驗展示。

3

簡單的答案是,在32位地址系統(例如)上,地址範圍是[0x00000000, 0xFFFFFFFF]。但是這並不意味着你可以在該範圍內的每個字節實際訪問。您需要知道操作系統和編譯器如何安排程序中的內存,即靜態數據段的位置,堆的位置,堆棧的位置等。

並且實現比任何給定的程序運行在現代操作系統上,大部分地址空間都是未映射的。使用虛擬內存,每個進程都有自己的地址空間,以便在一個進程中地址0x0010F444(例如)處的字節與每個其他進程中相同地址處的字節完全不同的物理字節。

+0

此外,堆可能不是連續的,有地址空間中有內存映射文件以及共享庫代碼。唷! – Artelius 2009-11-07 04:16:41