我做了一个调整,显示了钩住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修复但我想知道为什么会发生这种情况,也许我错过了一些重要的东西。
答案 0 :(得分:2)
#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 :(得分:1)
应该使用int pagesize = getpagesize();
因此,始终使用getpagesize()函数来获取大小 页面。
同样的问题可能是使用32位函数host_statistics而不是host_statistics64等等。
可悲的是,host_statistics64没有纠正这个问题(无论何时调用host_statistics或host_statistics64):( 页面大小为4096或16384(取决于设备),但页面计数始终相同。可能值得通过hardcode 4096来解决...