當使用寫時複製語義在進程間共享內存時,如何測試內存頁是可寫的還是標記爲只讀?這可以通過調用特定的彙編代碼,或者通過讀取內存中的特定位置或通過操作系統的API來完成?如何判斷內存頁是否標記爲只讀?
3
A
回答
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。然而,他們不鼓勵使用:
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從頁面描述符中讀取保護模式,該頁面描述符只能從內核模式訪問。
相關問題
- 1. gdb:如何判斷某個內存是否被標記爲只讀
- 2. 如何判斷PDF是否被標記
- 3. 如何判斷網頁是否存在?
- 4. 如何判斷MemberInfo是否爲內部
- 5. 如何判斷是否存在W.I.F標記? - 最佳方法
- 6. 如何判斷「內聯」是否工作?
- 7. 如何判斷NSUserDefaults是否已保存?
- 8. 如何判斷NSManagedObject是否已保存?
- 9. 如何判斷是否沒有要從HttpURLConnection讀取的內容
- 10. 如何判斷當前是否選擇了Google地圖標記?
- 11. 如何判斷當前修訂版是否被標記
- 12. 如何判斷Mongo集合(C#)中是否存在記錄
- 13. 如何判斷MIDIEndpointRef是否爲虛擬?
- 14. 如何判斷AirPlay是否爲鏡像?
- 15. 如何判斷孩子是否爲零
- 16. 如何判斷對象是否爲空?
- 17. 如何判斷變量是否爲空?
- 18. 如何判斷GIF是否爲動畫?
- 19. 如何判斷UITextField是否爲firstResponder
- 20. 如何判斷Gtk.Widget是否爲Gtk.Container?
- 21. 如何判斷資源是否爲空?
- 22. 如何判斷兩個網頁內容是否相似?
- 23. Android Webview - 如何判斷頁面是否從緩存中加載?
- 24. 如何判斷脫字號是否在H1標籤內?
- 25. 如何判斷內存地址在OS中是否空閒?
- 26. 如何判斷CString是否在堆或棧上分配內存?
- 27. 如何判斷使用window.print()時頁面是否爲打印機?
- 28. 如何判斷某個頁面是否爲ASP中的SSL?
- 29. 如何判斷用戶是否爲粉絲頁面的粉絲
- 30. 如何判斷XML元素在XSD文件中是否標記爲必需
Chris對Windows的評論是正確的。請務必在下面看到Jim Nelson的評論和Raymond Chen的博客。 – Foredecker 2008-11-02 05:33:16