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

我做了一个调整,显示了钩住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修复,但我想知道为什么会发生这种情况,也许我错过了一些重要的东西。

#import 您可以访问vm_page_sizevm_kernel_page_size (仅限OS X 10.9 + iOS 7)

vm_kernel_page_size = 4096

vm_page_size = 16384

不推荐使用call 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上测试

应该使用int pagesize = getpagesize();

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

( 从这里 )

另外一个问题可能是使用32位函数host_statistics而不是host_statistics64等等。

遗憾的是,host_statistics64不能解决这个问题(无论何时调用host_statistics或host_statistics64):(页面大小为4096或16384(取决于设备),但页面计数总是相同的。可能值得通过硬编码4096进行解决…