2014-02-04 2 views
3

Я сделал настройку, которая показывает свободный барабан внутри подключенного метода SpringBoard. Я использую этот код:Странное поведение на 64-битных устройствах iOS при получении статистики vm

mach_port_t host_port; 
    mach_msg_type_number_t host_size; 
    vm_size_t pagesize; 

    host_port = mach_host_self(); 
    host_size = sizeof(vm_statistics_data_t)/sizeof(integer_t); 
    host_page_size(host_port, &pagesize); 

    vm_statistics_data_t vm_stat; 

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS){ 
     ram = @"N/A"; 
    }else{ 
     natural_t bytes = (vm_stat.free_count * pagesize); 
    } 

На устройствах, предшествующих 5-м и воздуху, работает отлично. Но 64-битные пользователи устройств сообщили, что они получают количество свободного бара больше, чем максимальное количество ОЗУ на устройстве. Я сделал утилиту командной строки с тем же кодом и попросил запустить ее как root из терминала, а утилита командной строки указала правильные значения. Я проверил, почему это происходит, и выяснил, что внутри SpringBoard на 64-битных устройствах host_page_size(host_port, &pagesize); возвращает pageize = 16384, что на самом деле в 4 раза больше, чем в утилите командной строки. Опять же, это влияет только на 64-разрядные устройства, на других устройствах он показывает страницыize = 4096 (правильное значение) независимо от того, где. Его можно исправить с помощью hardcoded pagesize = 4096, но я хочу знать, почему это происходит, может быть, мне не хватает чего-то важного.

ответ

1

после #import <mach/mach.h> вы можете получить доступ к vm_page_size и vm_kernel_page_size (только с OS X 10.9 + IOS 7)

vm_kernel_page_size = 4096

vm_page_size = 16384

осуждается вызов getpagesize() возвращает нас 16384

host_page_size(mach_host_self(), &pagesize) возвращение 4096

следующий код, вернитесь 16384:

vm_size_t pagesize = 0; 
int mib[] = { CTL_HW, HW_PAGESIZE }; 
size_t length = sizeof(pagesize); 
const int sysctlResult = sysctl(mib, 2, &pagesize, &length, NULL, 0); 

Проверено на arm64 + IOS 9.0.2

1

Если использовать int pagesize = getpagesize();

Поэтому всегда используйте функцию getpagesize(), чтобы получить размер страницы.

(from here)

Также проблема может быть в использовании 32-разрядных функций host_statistics вместо host_statistics64 и так далее.

К сожалению, host_statistics64 не исправляет эту проблему (когда host_statistics вызова или host_statistics64) :( размера страницы 4096 или 16384 (зависит от устройства), но страницы подсчеты же всегда. Может быть, стоит обойти по жёстко 4096 ...

+0

Я проверил это прямо сейчас на iOS8, и мой старый код, и 'getpagesize()' дают правильные значения везде. Во всяком случае, было странно, что он показывал разные значения в iOS7 в SpringBoard и в исполняемом файле командной строки. – user1855732

+0

Также проблема может заключаться в использовании 32-битной функции host_statistics вместо host_statistics64 и так далее. – alexandrmoroz

+0

К сожалению, host_statistics64 не исправляет эту проблему :(Размер страницы 4096 или 16384 (зависит от устройства), но количество страниц одинаково всегда. Возможно, стоит обходным путем по hardcode 4096 ... – alexandrmoroz