2011-08-05 47 views
3

我正在使用vm_region_recurse_64爲給定進程vmmap樣式映射內存。mach_vm_region_recurse,在osx上映射內存和共享庫

然而,vm_region_recurse似乎不同意vmmap命令行工具的具體內存部分開始的某些特定內存部分開始時應用程序通過檢查每個庫的Mach-O標頭並結束。

在加載了大多數os共享庫的90000000-a0000000系統子映射中尤其如此。

現在我很難過。我可以列出內存段,總體說明它們是什麼類型,並用vm_read從它們中讀取。但列出他們並得到正確和具體的地區信息證明是困難的。

vmmap如何獲取加載庫的特定位置列表?我的方法似乎是無效的。

編輯:這是我正在使用的基本代碼。它返回的內存映射與vmmap的類似但不相同。沒有特定庫的內存區域。

kern_return_t krc = KERN_SUCCESS; 
vm_address_t address = 0; 
vm_size_t size = 0; 
uint32_t depth = 1; 
while (1) { 
    struct vm_region_submap_info_64 info; 
    mach_msg_type_number_t count = VM_REGION_SUBMAP_INFO_COUNT_64; 
    krc = vm_region_recurse_64(port, &address, &size, &depth, (vm_region_info_64_t)&info, &count); 
    if (krc == KERN_INVALID_ADDRESS){ 
     break; 
    } 
    if (info.is_submap){ 
     depth++; 
    } 
    else { 
     //do stuff 
     printf ("Found region: %08x to %08x\n", (uint32_t)address, (uint32_t)address+size); 
     address += size; 
    } 
} 

回答

3

vmmap調用mach_vm_region_recurse()列出內存區域。

爲了查看像dyld共享緩存在0x90000000..0xa0000000這樣的子地圖的內容,您需要查找設置了is_submap的區域,然後再次使用相同的地址和更深的nesting_depth調用mach_vm_region_recurse() 。

+0

在正確的軌道上......但我發現了這一點。好的,時間爲片段。我將編輯我的原始帖子。 –

+1

我認爲這是正確的。無論出於何種原因,整個dyld共享緩存都作爲一個內存對象出現,而不是單獨的區域,但是這種方法讓我穿透子圖並訪問內存對象。我將不得不更多地瞭解如何閱讀在dyld共享緩存中加載哪些庫。 –

+0

你有沒有想過這個?我在同一條船上獲得指向dyld_shared_cache的文件名,我想要得到真正的dylib請求。 –

2

vmmap(1)通過檢查目標地址空間中剩餘的DYLD表,實際獲得加載過程中加載的Mach-O圖像的列表。