内存映像文件

Linux允许任何进程把一个磁盘文件映像到内存中。

使用内存映像文件有两个主要优点

  –加速文件I/O操作,不同的I/O调用如read或者fputs通过内核缓冲读出或写入数据。虽然Linux具有一种快速而先进的磁盘缓冲算法,但最快的磁盘访问也总是要比最慢的内存访问慢。

  –共享数据,如果多个进程要访问一样的数据,这些数据就可以保存在一个内存映像文件中,所有的进程都可以访问它。

mmap函数

#include <unistd.h>

#include <sys/mman.h>

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)

在文件描述符fd指定打开的文件中,从文件起始处offset位置开始映像文件到内存start开始的地方。

offset通常为0,代表整个文件都映像到内存中。

length指定了文件被映像的大小。

执行成功返回指向内存区域的指针,失败返回-1,并设置errno变量

参数prot---保护模式

  –其值可以逻辑“或”



说明


PROT_NONE


不允许访问


PROT_READ


内存可读


PROT_WRITE


内存可写


PROT_EXEC


内存可执行

参数flags---映像的属性

  –其值可以逻辑“或”



说明


MAP_FIXED


如果start无效或者正在使用则失败


MAP_PRIVATE


对映像内存区域的写入操作是进程私有的


MAP_SHARED


对映像内存区域的写入操作也被复制到文件

映像内存区域必须用MAP_PRIVATE标为私有或者用MAP_SHARED标为可共享。

munmap函数

int munmap(void *start, size_t length)

当使用完一个内存映像文件后,需要调用munmap解除内存映像,并把内存释放返回给操作系统。

参数start指向要解除映像的内存区域起始位置。

参数length指定了被释放内存区域的大小。

执行成功返回指向内存区域的指针,失败返回-1,并设置errno变量。

当一块内存解除映像后,再尝试访问start,会导致一个段错误

当一个进程终止时,所有的内存映像都会被解除

mmap、munmap函数例子

int main()
{
    int fdin = open("aaa.txt", O_RDONLY);
    struct stat statbuf;
    fstat(fdin, &statbuf);
    off_t len = statbuf.st_size;
    char *s = mmap(0, len, PROT_READ, MAP_SHARED, fdin, 0);
    printf(s);
    munmap(s, len);
    close(fdin);
    return 0;
}

msync函数

int msync(const void *start, size_t length, int flags)

msync函数把被映像的文件写入磁盘。

参数flags可以使下面值的一个或多个“或”。

  –MS_ASYNC—调用一次写入操作后返回。

  –MS_SYNC—在msync返回前写入数据。  

  –MS_INVALIDATE—让映像到同一个文件的映像无效,以便新数据更新它们。

msync函数例子

int main()
{
    int fdin = open("aaa.txt", O_RDWR);
    struct stat statbuf;
    fstat(fdin, &statbuf);
    off_t len = statbuf.st_size;
    char *s = mmap(0, len, PROT_WRITE | PROT_READ, MAP_SHARED, fdin, 0);
    printf(s);
    strcpy(s, "hello world");
    msync(s, len,  MS_SYNC);
    munmap(s, len);
    close(fdin);
    return 0;
}

锁定内存

int mlock(const void *start, size_t len);

int munlock(void *start, size_t len);

Linux系统,如果在一段时间内存不被访问,可能会将内存数据暂时写入交换分区(磁盘的一个特殊区域)。

锁定内存就是设置一个标志,防止系统将内存数据写入交换分区。

只有root用户才有权限对内存区域进行锁定。

int mlock(const void *start, size_t len);

int munlock(void *start, size_t len);

Linux系统,如果在一段时间内存不被访问,可能会将内存数据暂时写入交换分区(磁盘的一个特殊区域)。

锁定内存就是设置一个标志,防止系统将内存数据写入交换分区。

只有root用户才有权限对内存区域进行锁定。

复制去Google翻译翻译结果

时间: 2024-08-05 07:05:32

内存映像文件的相关文章

内存映像IO-Linux下C编程指南

内存映像是通过将文件映射到内存中去以提高文件读取速度. 此时可以使用指针快速访问文件中的数据 1. 使用的函数 要将外部存储的文件映射到内存中,需要使用 #include<sys/types.h> #include<sys/mman.h> void *mmap(void *start.size_t length,int prot,int flag,int fd,off_t offset); 此时,若start不为NULL会将文件映射到此位置,但是不保证一定能成功: length表示

android系统映像文件

android源码编译后得到system.img,ramdisk.img,userdata.img映像文件.其中,ramdisk.img是emulator(模拟器)的文件系统,system.img包括了主要的包.库等文件,userdata.img包括了一些用户数据,emulator负责加载这3个映像文件. 下面我们来简要分析一下这三个镜像文件. 如下图所示是编译之后生成的相关文件. 其中三个镜像对应的文件夹上图也很明了了.android系统启动后,会把system.img和userdata.im

如何查看Linux内核的initrd.img映像文件

initrd的含义是initialized ram disk.ram disk用一部分内存模拟成磁盘,让操作系统访问. initrd.img文件就是个ram disk的映像文件.ram disk是标准内核文件认识的设备(/dev/ram0)文件系统也是标准内核认识的文件系统.通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块和服务,经过一些配置和运行后,就可以去物理磁盘加载真正的root分区了,然后再进行配置,最后启动成功. 查看Linux内核的

linux c 内存映像的代码

将代码过程中比较重要的一些代码段做个记录,下边资料是关于linux c 内存映像的代码,应该是对大家有些用处. #include<sys/types.h> #include<sys/mman.h> start为指针通常设为NULL,表示映射内存有系统决定.因为指定内存会经常出错.length为内存映像占用的内存空间大小.以字节为单位.port表示内存映像的安全性.PROT_EXEC表示被映像内存可能有机器码,可执行.PORT_NONE表示被映像内存不能被访问.PORT_READ表示

无需转化直接使用ESD映像文件安装系统简明教程

最近都是如火如荼的win10 微软三天两头的出新版本的更新,出来都是esd的文件,所以网上就找了个帖子 怎么用esd来安装 原文地址:http://www.heu8.com/1049.html 昨天撰文介绍了ESD映像文件,相信细心的网友对这种格式的映像已经很明白了.原版系统ISO镜像的sources文件夹中包含install.wim映像文件,将这个WIM文件“解压”(官方术语“Apply”)后,可以看到和C盘的目录完全相同,即为系统文件.而官方提供的原版ESD映像与ISO镜像是类似的,因为内部

iOS将大文件映射到内存(读取大文件)

http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个78M的大数据文件,一开始采用了NSData的dataWithContentsOfFile:方法.不少人反馈说如果直接使用,将会耗尽iOS的内存.其实这个是可以改善的. NSData还有一个API: + (id)dataWithContentsOfFile:(NSString *)path options:(N

使用loop设备挂载映像文件

loop设备介绍 在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备.它能使我们像块设备一样访问一个文件. 在使用之前,一个 loop 设备必须要和一个文件进行连接.这种结合方式给用户提供了一个替代块特殊文件的接口.因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来. 上面说的文件格式,我们经常见到的是 CD 或 DVD 的 ISO 光盘镜像文件或者是软盘(硬盘)的 *.img 镜像文件.通过

[转载]内存偏移与文件偏移相互转换

RVA = 虚拟地址 - 基址 如: 00423562 - 00400000 = 23562 -------------------------------------------------- 作 者: LeoF 时 间: 2010-03-23,17:53:48 链 接: http://bbs.pediy.com/showthread.php?t=109449 写此文源于前一阵写一个PE修改工具,需要用到内存偏移向文件偏移转化.想着这种简单的代码网上应该一大把,百度了一下,没找到.又googl

内存运行PE文件

内存中运行文件 拿exe并在HxD或010中打开 - cntrl+a copy as C 粘贴到encrypt.cpp 编译并运行encrypt.cpp - 创建shellcode.txt 从shellcode.txt复制char数组,并替换runPE.cpp中的rawData [] 编译生成最终的runPE.exe 使用XOR密钥解密,加载到内存中执行. encrypt.cpp //encrypt shellcode prior to storing in stub //store in sh