gpt4 book ai didi

ios - 检索 vm 统计信息时 64 位 iOS 设备上的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:39 27 4
gpt4 key购买 nike

我做了一个调整,在 Hook 的 SpringBoard 方法中显示空闲内存。我正在使用这段代码:

    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 位设备用户报告说,他们获得的可用内存量大于设备上的最大内存量。我用相同的代码制作了命令行实用程序,并要求以 root 身份从终端运行它,命令行实用程序显示了正确的值。我检查了它发生的原因,发现在 64 位设备上的 SpringBoard 内部 host_page_size(host_port, &pagesize); 返回 pagesize = 16384,实际上比它在命令行实用程序中显示的大 4 倍。同样,它只影响 64 位设备,在其他设备上,无论在哪里,它都显示 pagesize = 4096(正确值)。它可以通过硬编码 pagesize = 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()返回我们 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 上测试

关于ios - 检索 vm 统计信息时 64 位 iOS 设备上的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552747/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com