vm_pattr 系统调用和 kvm_pattr 内核服务
用途
查询或修改虚拟内存属性。
库
标准 C 库 (libc.a)
语法
描述
vm_pattr 系统调用查询或修改调用进程的地址空间或其他用户进程的地址空间的内存属性。
克夫 _pattr 内核服务向内核子系统 (内核扩展,内核进程等) 提供相同的功能,但它不能修改另一个内核进程的内存属性。
参数
| 项 | 描述 | ||
|---|---|---|---|
| cmd | 以下命令可以传递到:
|
||
| pid | 指定要对其内存属性进行查询或修改的进程的标识。 -1 的值表示调用进程。 root 用户可以指定任何进程标识,但其他用户只能指定他们拥有的进程 (即,目标进程的用户标识必须与调用进程的用户标识相匹配)。 vm_pattr 系统调用仅支持用户进程,而 kvm_pattr 内核服务可以针对用户进程或自己的内核进程(例如,pid = -1) )。 |
||
| attr | 一个指向结构的指针,该结构描述正在查询或修改的内存的有效地址范围以及附加数据 (取决于命令)。 范围是通过以下 vm_pa_range 结构指定的:
指定的范围必须在目标进程的地址空间中,并且必须对应于下列其中一个进程区域:
|
||
| 阿特尔 (续) | 通过 阿特尔 参数指定的结构必须是一个指向下列其中一个结构的指针:
|
||
|
|||
| 阿特尔 (续) | 如果 pa_info 字段为 NULL ,那么此命令与 VM_PA_GET_PSIZE 命令完全相同。 pa_info 字段应该指向一个包含两个 64 位整数的数组。 应该将 pa_info_size 字段设置为数组的大小。 在第一个 64 位整数中,此命令报告指定 pa_range 范围内大小为 64 KB 且对齐的次区域数,这些次区域包含 16 个连续的 4 KB 页,这些页已升级为使用 64 KB 页大小的硬件转换。 在第二个 64 位整数中,此命令报告指定范围内 16 MB 大小和对齐的次区域数,这些次区域由 4096 4 KB 或 256 64 KB 连续页面组成,这些页面已升级为使用 16 MB 大小的硬件转换。 pa_psize 字段报告在指定范围内找到的最小页大小。 报告的信息是瞬时的,因为操作系统随时都可以更改支持页面大小。 因此,所报告的页大小必须仅用于参考目的。 |
||
| 阿特尔 (续) |
|
||
| 阿特尔 (续) |
|
||
| 阿特尔 (续) |
|
||
| 阿特尔 (续) | 进程的内存区域 最小对齐 主进程数据 256 MB 进程堆栈 256 MB 共享库数据 256 MB 专用装入的模块数据 256 MB 专用装入的模块文本 256 MB POSIX 实时共享内存 256 MB 匿名 MMAP 256 MB 匿名扩展 System V 共享内存 256 MB 页面大小小于或等于 256 MB 256 MB 的匿名 System V 共享内存 支持 16 GB 页大小为 1 TB 的匿名 System V 共享内存 |
||
| 阿特尔 (续) |
VMPATTR_SET_PSIZE_VALID 指定的页面大小可以用于指定的范围。 VMPATTR_INVALID_MPSS_PSIZE 指定的页大小在混合页大小段中不受支持。 VMPATTR_NON_MPSS_SEGMENT 指定的地址范围是来自不支持混合页大小的段。 VMPATTR_NON_MPSS_PAGE 不能修改目标页面的大小。 例如,当尝试将地址范围设置为 64 KB 页大小时,如果该范围的一部分具有与该范围的其余部分不匹配的页保护设置,那么可能会返回此原因码。 VMPATTR_RDONLY_MEM 无法修改目标范围,因为调用者对指定的内存不具有写访问权。 VMPATTR_PAGE_ATTRIBUTES 指定的地址范围没有统一的页面属性。 VMPATTR_NOT_FULLY_POPULATED 指定的地址范围不完全驻留在内存中。 VMPATTR_PHYSICAL_ATTACHMENTS 指定的地址范围具有指定多个亲缘关系域的内存亲缘关系附件。 VMPATTR_MEMORY_TYPE_UNSUPPORTED 地址范围包含一个内存对象,该对象在混合页大小段中不支持所请求的页大小。 |
||
| 属性大小 | 对于指定的命令, 属性大小 参数必须是所需结构的大小或更大的大小。 | ||
返回值
成功后,这些命令将返回 0。 否则,系统将返回 -1 并设置 errno 全局变量以显示错误。
错误代码
| 项 | 描述 |
|---|---|
| EPERM | 调用进程没有执行所请求的操作的适当特权。 |
| ESRCH | 目标进程不存在,或者未处于有效状态。 |
| ENOMEM | 指定的范围包含孔。 孔是目标进程的地址空间中不受虚拟内存段支持或不在指定的虚拟内存段的有效范围内的任何部分。 |
| ENOTSUP | 以下任何情况都可能会导致 ENOTSUP 错误:
|
| EINVAL | 以下任何情况都可能会导致 EINVAL 错误:
|
| ENOMEM | 指定的命令为 VM_PA_SET_PSIZE_EXTENDED,并且系统无法从由 pa_info 对象指定的亲缘关系域集或整个系统亲缘关系域集分配内存,而可能导致性能下降。 |
| EFAULT | 指定的命令为 VM_PA_SET_PSIZE_EXTENDED或 VM_PA_GET_PSIZE_EXTENDED ,且 pa_info 地址无效且不为 NULL。 |
| EINVAL | 指定的命令为 VM_PA_SET_PSIZE_EXTENDED或 VM_PA_GET_PSIZE_EXTENDED , pa_info 字段不为-NULL ,但 pa_info_size 字段为 0。 |
| ENODEV | 指定的命令为 VM_PA_SET_PSIZE_EXTENDED,并且在 pa_info中指定了无效的 sradid。 |