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

标签 ios jailbreak theos

我做了一个调整,在 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/

相关文章:

ios - 自动检查文本字段长度并点击方法 UITextfield

objective-c - 允许 iOS 用户从应用程序包中通过电子邮件发送 PDF

ios - Restkit,将参数放在路径中

iphone - 修改 usr/bin 后可执行文件中的 CPU 类型错误

ios - 在页面 View Controller 中以编程方式使用 Storyboard 中的 View Controller

ios - iOS 应用程序的记录函数参数

ios - 如何在越狱调整中打开首选项的特殊 View ?

jailbreak - THEOS/iPhone 越狱编程 - 我应该如何从 ViewController 中隐藏 View ?

ios - 在 mobilesubtrate 调整中使用捆绑资源

ios - 如何在首选项包中使用 PSLinkListCell 中的值?