检索vm统计信息时,64位iOS设备上出现奇怪的行为

时间:2014-02-04 12:34:41

标签: ios jailbreak theos

我做了一个调整,显示了钩住SpringBoard方法中的自由ram。我正在使用此代码:

    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);
    }

在5s之前的设备和Air上工作正常。但64位设备用户报告称,他们获得的免费ram数量大于设备上的最大RAM量。我使用相同的代码创建了命令行实用程序,并要求从终端以root身份运行它,命令行实用程序显示正确的值。我查看了为什么会发生这种情况,并发现SpringBoard在64位设备host_page_size(host_port, &pagesize);内部返回的pagesize = 16384实际上比命令行实用程序中显示的大4倍。同样,它只影响64位设备,在其他设备上,它显示pagesize = 4096(正确值),无论在何处。它可以用hardcoded pagesize = 4096修复但我想知道为什么会发生这种情况,也许我错过了一些重要的东西。

2 个答案:

答案 0 :(得分:2)

#import <mach/mach.h>后的

您可以访问vm_page_sizevm_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 :(得分:1)

应该使用int pagesize = getpagesize();

  

因此,始终使用getpagesize()函数来获取大小   页面。

from here

同样的问题可能是使用32位函数host_statistics而不是host_statistics64等等。

可悲的是,host_statistics64没有纠正这个问题(无论何时调用host_statistics或host_statistics64):( 页面大小为4096或16384(取决于设备),但页面计数始终相同。可能值得通过hardcode 4096来解决...

相关问题