创建与销毁虚拟内存到物理内存或文件的映射

创建虚拟内存到物理内存或文件的映射

#include

void* mmap (
void* start, // 映射区内存起始地址,NULL系统自动选定,成功返回之
size_t length, // 字节长度,自动按页(4K)对齐
int prot, // 映射权限
int flags, // 映射标志
int fd, // 文件描述符
off_t offset // 文件偏移量,自动按页(4K)对齐
);

成功返回映射区内存起始地址,失败返回MAP_FAILED(-1)。

prot取值:

PROT_EXEC - 映射区域可执行。

PROT_READ - 映射区域可读取。

PROT_WRITE - 映射区域可写入。

PROT_NONE - 映射区域不可访问。

flags取值:

MAP_FIXED - 若在start上无法创建映射,
则失败(无此标志系统会自动调整)。

MAP_SHARED - 对映射区域的写入操作直接反映到文件中。

MAP_PRIVATE - 对映射区域的写入操作只反映到缓冲区中,
不会真正写入文件。

MAP_ANONYMOUS - 匿名映射,
将虚拟地址映射到物理内存而非文件,
忽略fd。

MAP_DENYWRITE - 拒绝其它对文件的写入操作。

MAP_LOCKED - 锁定映射区域,保证其不被置换。

销毁虚拟内存到物理内存或文件的映射

int munmap (
void* start, // 映射区内存起始地址
size_t length, // 字节长度,自动按页(4K)对齐
);

成功返回0,失败返回-1。

范例:mmap.c

#include
#include
#include

#define MAX_TEXT 256

int main (void)
{
char* psz = (char*)mmap (/sbrk (0)/NULL, MAX_TEXT * sizeof (char),
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (psz == MAP_FAILED)
{
perror (“mmap”);
return -1;
}

sprintf (psz, "Hello, World !");
printf ("%s\n", psz);

printf ("psz = %p\n", psz);
printf ("查看/proc/%u/maps,按<回车>退出...", getpid ());
getchar ();

if (munmap (psz, MAX_TEXT * sizeof (char)) == -1) 
{
    perror ("munmap");
    return -1;
}

return 0;

}

你可能感兴趣的:(linux)