mremap() - Unix,Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

mremap() - Unix,Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

mremap - 重新映射虚拟内存地址

语法

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/mman.h>

void * mremap(void *old_address, size_t old_size , size_t new_size, int flags);

描述

mremap() 扩展(或缩小)现有的内存映射,同时可能移动它(由flags 参数和可用的虚拟地址空间控制)。

old_address 是要扩展(或缩小)的虚拟内存块的旧地址。请注意,old_address 必须是页面对齐的。old_size 是虚拟内存块的旧大小。new_size 是调整大小后虚拟内存块的请求大小。

在 Linux 中,内存被划分为页面。用户进程具有(一个或)多个线性虚拟内存段。每个虚拟内存段都具有一个或多个映射到实际内存页面的映射(在页表中)。每个虚拟内存段都有自己的保护(访问权限),如果内存访问不正确(例如,写入只读段),则可能会导致段错误。访问段之外的虚拟内存也会导致段错误。

mremap() 使用 Linux 页表方案。mremap() 更改虚拟地址和内存页面之间的映射。这可以用来实现非常高效的realloc()。

flags 位掩码参数可以为 0,或包含以下标志

标签描述
MREMAP_MAYMOVE
 默认情况下,如果没有足够的空间在当前位置扩展映射,则mremap() 失败。如果指定了此标志,则内核允许根据需要将映射重新定位到新的虚拟地址。如果映射被重新定位,则指向旧映射位置的绝对指针将变得无效(应使用相对于映射起始地址的偏移量)。
MREMAP_FIXED(自 Linux 2.3.31 起)
 此标志的作用类似于mmap(2) 的MAP_FIXED 标志。如果指定了此标志,则mremap() 接受第五个参数void *new_address,它指定映射必须移动到的页面对齐地址。new_addressnew_size 指定的地址范围内的任何先前映射都将被取消映射。如果指定了MREMAP_FIXED,则还必须指定MREMAP_MAYMOVE
如果由old_addressold_size 指定的内存段被锁定(使用mlock() 或类似方法),则当段调整大小和/或重新定位时,此锁定将保持。因此,进程锁定的内存量可能会发生变化。

返回值

如果成功,mremap() 返回指向新虚拟内存区域的指针。如果出错,则返回MAP_FAILED(即 (void *) -1),并且errno 被相应地设置。

错误

标签描述
EAGAIN 调用者尝试扩展已锁定的内存段,但如果没有超过RLIMIT_MEMLOCK 资源限制,则无法做到这一点。
EFAULT “段错误”。old_addressold_address+old_size 范围内的某些地址对于此进程来说是无效的虚拟内存地址。即使存在覆盖请求的整个地址空间的映射,但这些映射类型不同,您也可能会收到 EFAULT。
EINVAL 给出了无效的参数。可能的原因是:old_address 未对齐页面;flags 中指定的值不是MREMAP_MAYMOVEMREMAP_FIXEDnew_size 为零;new_sizenew_address 无效;或者由new_addressnew_size 指定的新地址范围与由old_addressold_size 指定的旧地址范围重叠;或者在没有也指定MREMAP_MAYMOVE 的情况下指定了MREMAP_FIXED
ENOMEM 无法在当前虚拟地址扩展内存区域,并且flags 中未设置MREMAP_MAYMOVE 标志。或者,没有足够的(虚拟)内存可用。

备注

在 2.4 版之前,glibc 不会公开MREMAP_FIXED 的定义,并且mremap() 的原型不允许使用new_address 参数。

符合标准

此调用是 Linux 特定的,不应在旨在可移植的程序中使用。4.2BSD 有一个(从未真正实现的)mremap(2) 调用,其语义完全不同。

参见

您最喜欢的操作系统教科书,以获取有关分页内存的更多信息。(Andrew S. Tannenbaum 的现代操作系统,Randolf Bentson 的Linux 内部,Maurice J. Bach 的UNIX 操作系统设计。)

previous next Printer Friendly

广告


  

广告



广告