检索VM统计数据时,在64位iOS设备上的奇怪行为



我进行了一项调整,该调整显示了挂钩跳板方法中的自由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和空气上它的工作正常。但是64位设备用户报告说,他们获得的免费RAM量大于设备上的最大RAM。我用相同的代码制作了命令行实用程序,并要求将其作为root从终端运行,命令行实用程序显示正确的值。我检查了为什么会发生这种情况,并发现在64位设备上的Springboard host_page_size(host_port, &pagesize);返回PageSize = 16384实际上是命令行实用程序中显示的4倍。同样,它仅影响64位设备,在其他设备上,它显示PAGESIZE = 4096(正确的值)无论何处。它可以用硬编码的Pageize = 4096修复,但我想知道为什么会发生这种情况,也许我缺少一些重要的东西。

#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()返回US 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位函数hostrongtatistics而不是hostrongtatistics 64等。

可悲的是,hostrongtatistics 64不会纠正该问题(每当呼叫hostrongtatistics或hostrongtatistics 64):(页面大小为4096或16384(取决于设备),但页数总是相同的。可能值得通过硬码4096 ...

解决方案

相关内容

  • 没有找到相关文章

最新更新