Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 什么';mach_vm_allocate和vm_allocate的区别是什么?_Ios_Macos_Kernel_Mach - Fatal编程技术网

Ios 什么';mach_vm_allocate和vm_allocate的区别是什么?

Ios 什么';mach_vm_allocate和vm_allocate的区别是什么?,ios,macos,kernel,mach,Ios,Macos,Kernel,Mach,我想知道mach\u vm\u allocate和vm\u allocate之间有什么区别。我知道,mach\u vm\u allocate仅在OSX中可用,而在iOS中不可用,但我不知道为什么。包含所有函数原型的文件只支持iOS中引入的新mach vm API。mach OS X 10.4中引入的mach vm API。从程序员的角度来看,新API与旧API基本相同,但有以下主要区别 -例程名称具有马赫前缀。例如,vm_allocate()变为mach_vm_allocate() -例程中使用

我想知道
mach\u vm\u allocate
vm\u allocate
之间有什么区别。我知道,
mach\u vm\u allocate
仅在OSX中可用,而在iOS中不可用,但我不知道为什么。包含所有函数原型的文件只支持iOS中引入的新mach vm API。

mach OS X 10.4中引入的mach vm API。从程序员的角度来看,新API与旧API基本相同,但有以下主要区别

-例程名称具有马赫前缀。例如,vm_allocate()变为mach_vm_allocate()

-例程中使用的数据类型已更新,以支持64位和32位任务。因此,新的API可以用于任何任务

新的和旧的API由不同的MIG子系统导出: 分别是马赫数vm和马赫数map。相应的头文件是 和


这些将是/usr/include/mach/mach_vm.h和/usr/include/mach/vm_map.h。您可以grep in/usr/include/mach来获取这些


在内核中,API基本上使用相同的实现。在iOS上,您可以很好地使用“旧”API。

Mac OS X 10.4中引入的新Mach VM API。从程序员的角度来看,新API与旧API基本相同,但有以下主要区别:

  • 例程名称的前缀为
    mach\uu。例如,
    vm\u allocate()
    变为
    mach\u vm\u allocate()

  • 例程中使用的数据类型已更新,以支持64位和32位任务。因此,新的API可以用于任何任务

新的和旧的API分别由不同的MIG子系统导出:
mach_vm
vm_map
。相应的头文件分别是


这些信息来源于《OSX系统方法》一书。

我对其他答案不满意。两个似乎引用了同一个来源(一个没有正确的属性),而这个来源相当误导

中的数据类型大小可变。如果您是为i386 CPU体系结构编译,那么它们是32位的;如果您是为x86_64 CPU体系结构编译,那么它们是64位的

中的数据类型为固定大小且始终为64位

由于32位进程只需要32位数据类型,而64位进程即使使用旧的API也已经有了64位类型,因此根本不清楚为什么需要新的API。但如果你看看苹果的内核设计,就会发现这一点:

macOS真正的内核是一个微内核。作为一个微内核,它只负责进程和线程管理、IPC、虚拟内存管理和进程/线程调度。就这样。通常,当使用micros内核时,其他的一切都会在用户空间中完成,但速度很慢,因此苹果采取了不同的方法

苹果公司采用FreeBSD单片内核,并将其包裹在微内核上,微内核将FreeBSD内核作为具有特殊权限的单个进程(任务)执行(尽管是任务,但代码与系统中的所有其他任务一样在内核空间而非用户空间中运行)。组合内核的名称为

在过去,苹果支持在一个系统中混合32位和64位的任何组合:您的系统可以运行32位内核并在其上运行32位或64位进程,也可以运行64位内核并在其上运行32位或64位进程。你可能已经看到了这一切,不是吗

如果进程和内核的位宽度不同,那么旧的API就没有用处了。例如,32位内核不能使用它与64位进程的内存进行交互,因为API调用的所有数据类型在32位内核任务中只能是32位的,但64位进程有64位内存空间,即使内核本身没有

实际上,甚至还有第三个版本的API。引用以下评论:

*中有三种“XXX\u分配”功能的实现
*内核:mach_vm_allocate(对于平台上的任何任务),vm_allocate
*(对于具有相同地址空间大小的任务,尤其是当前任务),
*和vm32_vm_allocate(针对32位任务的特定情况)。虚拟机分配
*在内核中,只能在内核任务上使用。vm32_仅vm_分配
*在用户任务可以是32或64或内核的平台上是有意义的
*任务可以是32或64。mach_vm_分配在任何地方都有意义,并且是首选
*对于新代码。
只要您仅在用户空间中使用该API,并且仅用于旧进程的内存管理,使用旧API仍然可以,即使对于64位进程也是如此,因为在这种情况下,所有数据类型都将是64位的

只有在跨进程边界工作并且不确定两个进程都是32位还是64位时,才需要新的API。然而,苹果早就放弃了对32位内核的支持,同时他们也放弃了对32位用户空间的支持,因为从10.15(Catalina)开始,所有系统库只作为64位库提供


在iOS上,不需要新的API,因为您永远无法为iOS编写内核代码,而且iOS的安全概念禁止与其他进程空间直接交互。在iOS上,您只能使用该API与自己的进程空间进行交互,因此它将始终具有正确的数据类型。

谢谢,@Ravindra。您可以指定头文件吗?看起来你的最后一句话好像没写。