2008-11-02 71 views
3

當使用寫時複製語義在進程間共享內存時,如何測試內存頁是可寫的還是標記爲只讀?這可以通過調用特定的彙編代碼,或者通過讀取內存中的特定位置或通過操作系統的API來完成?如何判斷內存頁是否標記爲只讀?

回答

3

在Linux上,你可以檢查的/ proc/PID /圖:

$ cat /proc/self/maps 

002b3000-002cc000 r-xp 00000000 68:01 143009 /lib/ld-2.5.so 
002cc000-002cd000 r-xp 00018000 68:01 143009 /lib/ld-2.5.so 
002cd000-002ce000 rwxp 00019000 68:01 143009 /lib/ld-2.5.so 
002d0000-00407000 r-xp 00000000 68:01 143010 /lib/libc-2.5.so 
00407000-00409000 r-xp 00137000 68:01 143010 /lib/libc-2.5.so 
00409000-0040a000 rwxp 00139000 68:01 143010 /lib/libc-2.5.so 
0040a000-0040d000 rwxp 0040a000 00:00 0 
00c6f000-00c70000 r-xp 00c6f000 00:00 0  [vdso] 
08048000-0804d000 r-xp 00000000 68:01 379298 /bin/cat 
0804d000-0804e000 rw-p 00004000 68:01 379298 /bin/cat 
08326000-08347000 rw-p 08326000 00:00 0 
b7d1b000-b7f1b000 r--p 00000000 68:01 226705 /usr/lib/locale/locale-archive 
b7f1b000-b7f1c000 rw-p b7f1b000 00:00 0 
b7f28000-b7f29000 rw-p b7f28000 00:00 0 
bfe37000-bfe4d000 rw-p bfe37000 00:00 0  [stack] 

第一列是虛擬內存地址範圍,第二列包含的權限(讀,寫,執行和私人),第3-6列包含偏移量,主要和次要設備號,inode以及內存映射文件的名稱。

1

如果您使用Win32,則會調用IsBadReadPtr和IsBadWritePtr。然而,他們不鼓勵使用:

"The general consensus is that the IsBad family of functions (IsBadReadPtr, IsBadWritePtr, and so forth) is broken and should not be used to validate pointers."

Raymond Chen的拿到這個的標題說明了一切:"IsBadXxxPtr should really be called CrashProgramRandomly"

陳有關於如何處理這個問題here一些有益的建議。

結果是,你不應該在運行時測試這種事情。代碼,以便你知道你要交給誰,如果這不是我們所期望的,那就把它當作一個錯誤。如果你沒有選擇,請考慮SEH處理異常。

1

您是否正在討論通過shmget(在Unix上)分配的各種共享內存?即

int shmget(key_t, size_t, int); 

如果是這樣,你可以使用

int shmctl(int, int, struct shmid_ds *); 

例如查詢內存:

key_t key = /* your choice of memory api */ 
int flag = /* set of flags for your app */ 
int shmid = shmget(key, 4096, flag); 

struct shmid_ds buf; 
int result = shmctl(shmid, IPC_STAT, &buf); 
/* buf.ipc_perm.mode contains the permissions for the memory segment */ 
3

在Win32中,最好的辦法是使用VirtualQuery。它爲地址所在的頁面返回一個MEMORY_BASIC_INFORMATION。其中一個成員爲Protect,它是these標誌的某種組合,其中包含可能的保護模式。該函數還會告訴您內存是否空閒,已提交,保留以及它是否是私有的,是映像或共享內存部分的一部分。

操作系統的API是確保頁面保護功能的最佳方式。 CPU從頁面描述符中讀取保護模式,該頁面描述符只能從內核模式訪問。

+0

Chris對Windows的評論是正確的。請務必在下面看到Jim Nelson的評論和Raymond Chen的博客。 – Foredecker 2008-11-02 05:33:16

相關問題