mach_vm_region_recurse, отображение памяти и общих библиотек на osx - PullRequest
4 голосов
/ 06 августа 2011

Я использую vm_region_recurse_64, чтобы отобразить память для данного процесса, стиль vmmap.

Попытка получить полный список совместно используемых библиотек, загруженных приложением, путем изучения заголовка Mach-O каждой библиотеки в памяти, однако vm_region_recurse, похоже, не согласна с инструментом командной строки vmmap относительно того, где конкретно начинаются некоторые из определенных разделов памяти, конец.

Это становится особенно актуальным в системном подкарте 90000000-a0000000, где загружено большинство общих библиотек os.

А теперь я немного озадачен. Я могу перечислить сегменты памяти, в общем сказать, какой у них тип, и читать из них с помощью 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;
    }
}

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

vmmap вызывает mach_vm_region_recurse () для получения списка областей памяти.

Чтобы увидеть содержимое подкарт, например, общего кеша dyld в 0x90000000..0xa0000000, вам нужно искать регионы с установленным is_submapи затем снова вызовите mach_vm_region_recurse () с тем же адресом и более глубоким значением nesting_depth.

2 голосов
/ 30 марта 2013

vmmap (1) фактически получает список изображений Mach-O, загруженных в процессе, путем проверки таблиц DYLD, оставленных в целевом адресном пространстве.

...