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

廣告


  

廣告



廣告
© . All rights reserved.