问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux内存管理之mmap详解

发布网友 发布时间:2024-10-02 05:19

我来回答

1个回答

热心网友 时间:2024-10-19 05:23

Linux内存管理之mmap详解

一. mmap系统调用

mmap是Linux内核提供的一种功能,用于将文件或其他对象映射到进程的内存中。文件会映射到多个页上,如果文件大小不是所有页大小的总和,那么最后一个页的未使用空间会被清零。munmap则执行相反的操作,移除特定地址区域的对象映射。

使用mmap映射文件到进程后,可以直接操作虚拟地址区域进行文件的读写等操作,无需再调用read,write等系统调用。但需注意,直接对该段内存进行写操作时不会写入超过当前文件大小的内容。

共享内存通信的一个显著优点是效率高,进程可以直接读写内存,而无需数据拷贝。与管道和消息队列等通信方式相比,共享内存只需要两次数据拷贝:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,通信时,进程并不总是读写少量数据后就解除映射,而是保持共享区域,直到通信结束,数据内容一直保存在共享内存中,并在解除映射时写回文件。因此,采用共享内存通信效率非常高。

基于文件的映射,在mmap和munmap执行过程中,被映射文件的st_atime可能被更新。使用PROT_WRITE和MAP_SHARED标志建立的文件映射,其st_ctime和st_mtime在对映射区写入后,但在msync()通过MS_SYNC和MS_ASYNC调用前会被更新。

使用方法:

#include

void *mmap(void *start, size_t length, int prot, int flags,

int fd, off_t offset);

int munmap(void *start, size_t length);

返回说明:

成功时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED(其值为(void *)-1),munmap返回-1。错误代码包括EACCES(访问错误)、EAGAIN(文件已被锁定或内存已锁定)、EBADF(无效文件描述符)、EINVAL(参数无效)、ENFILE(文件描述符限制)、ENODEV(文件系统不支持内存映射)、ENOMEM(内存不足)、EPERM(权限不足)、ETXTBSY(以只读方式打开文件,同时指定MAP_DENYWRITE标志)、SIGSEGV(尝试向只读区写入)、SIGBUS(尝试访问不属于进程的内存区)。

参数:

start:映射区的开始地址。

length:映射区的长度。

prot:期望的内存保护标志,不能与文件的打开模式冲突。可通过或运算组合为以下值:PROT_EXEC(可执行)、PROT_READ(可读)、PROT_WRITE(可写)、PROT_NONE(不可访问)。

flags:指定映射对象的类型、映射选项和是否可以共享。值可组合为以下位:MAP_FIXED(使用指定的映射起始地址,如果与现有映射空间重叠,重叠部分将被丢弃。起始地址必须落在页边界上)、MAP_SHARED(与其他所有映射此对象的进程共享映射空间,写入映射区相当于输出到文件,直到msync()或munmap()调用,文件实际上未更新)、MAP_PRIVATE(建立一个写入时复制的私有映射,内存区域的写入不会影响原文件)。

fd:有效的文件描述符。若使用MAP_ANONYMOUS,为了兼容问题,其值应为-1。

offset:被映射对象内容的起点。

二. 系统调用munmap()

#include

int munmap( void * addr, size_t len )。该调用解除进程地址空间中的映射关系,addr是mmap()返回的地址,len是映射区的大小。映射关系解除后,对原映射地址的访问将导致段错误。

三. 系统调用msync()

#include

int msync ( void * addr , size_t len, int flags)。通常,映射空间的更改不会直接写回磁盘文件中,直到munmap()调用后才执行此操作。通过调用msync()可以实现磁盘上文件内容与共享内存区内容的一致性。

四. mmap进行内存映射的原理

mmap系统调用的主要目的是将设备或文件映射到用户进程的虚拟地址空间,实现用户进程对文件的直接读写。此过程分为三步:在用户虚拟地址空间中寻找空闲的满足要求的连续虚拟地址空间(由内核的mmap系统调用完成)、建立虚拟地址空间与文件或设备物理地址之间的映射(通过修改进程页表实现)、在实际访问新映射页面时的操作(由缺页中断完成)。详细描述包括页表管理、虚拟地址与物理地址的映射、缺页异常处理等。

热心网友 时间:2024-10-19 05:24

Linux内存管理之mmap详解

一. mmap系统调用

mmap是Linux内核提供的一种功能,用于将文件或其他对象映射到进程的内存中。文件会映射到多个页上,如果文件大小不是所有页大小的总和,那么最后一个页的未使用空间会被清零。munmap则执行相反的操作,移除特定地址区域的对象映射。

使用mmap映射文件到进程后,可以直接操作虚拟地址区域进行文件的读写等操作,无需再调用read,write等系统调用。但需注意,直接对该段内存进行写操作时不会写入超过当前文件大小的内容。

共享内存通信的一个显著优点是效率高,进程可以直接读写内存,而无需数据拷贝。与管道和消息队列等通信方式相比,共享内存只需要两次数据拷贝:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,通信时,进程并不总是读写少量数据后就解除映射,而是保持共享区域,直到通信结束,数据内容一直保存在共享内存中,并在解除映射时写回文件。因此,采用共享内存通信效率非常高。

基于文件的映射,在mmap和munmap执行过程中,被映射文件的st_atime可能被更新。使用PROT_WRITE和MAP_SHARED标志建立的文件映射,其st_ctime和st_mtime在对映射区写入后,但在msync()通过MS_SYNC和MS_ASYNC调用前会被更新。

使用方法:

#include

void *mmap(void *start, size_t length, int prot, int flags,

int fd, off_t offset);

int munmap(void *start, size_t length);

返回说明:

成功时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回MAP_FAILED(其值为(void *)-1),munmap返回-1。错误代码包括EACCES(访问错误)、EAGAIN(文件已被锁定或内存已锁定)、EBADF(无效文件描述符)、EINVAL(参数无效)、ENFILE(文件描述符限制)、ENODEV(文件系统不支持内存映射)、ENOMEM(内存不足)、EPERM(权限不足)、ETXTBSY(以只读方式打开文件,同时指定MAP_DENYWRITE标志)、SIGSEGV(尝试向只读区写入)、SIGBUS(尝试访问不属于进程的内存区)。

参数:

start:映射区的开始地址。

length:映射区的长度。

prot:期望的内存保护标志,不能与文件的打开模式冲突。可通过或运算组合为以下值:PROT_EXEC(可执行)、PROT_READ(可读)、PROT_WRITE(可写)、PROT_NONE(不可访问)。

flags:指定映射对象的类型、映射选项和是否可以共享。值可组合为以下位:MAP_FIXED(使用指定的映射起始地址,如果与现有映射空间重叠,重叠部分将被丢弃。起始地址必须落在页边界上)、MAP_SHARED(与其他所有映射此对象的进程共享映射空间,写入映射区相当于输出到文件,直到msync()或munmap()调用,文件实际上未更新)、MAP_PRIVATE(建立一个写入时复制的私有映射,内存区域的写入不会影响原文件)。

fd:有效的文件描述符。若使用MAP_ANONYMOUS,为了兼容问题,其值应为-1。

offset:被映射对象内容的起点。

二. 系统调用munmap()

#include

int munmap( void * addr, size_t len )。该调用解除进程地址空间中的映射关系,addr是mmap()返回的地址,len是映射区的大小。映射关系解除后,对原映射地址的访问将导致段错误。

三. 系统调用msync()

#include

int msync ( void * addr , size_t len, int flags)。通常,映射空间的更改不会直接写回磁盘文件中,直到munmap()调用后才执行此操作。通过调用msync()可以实现磁盘上文件内容与共享内存区内容的一致性。

四. mmap进行内存映射的原理

mmap系统调用的主要目的是将设备或文件映射到用户进程的虚拟地址空间,实现用户进程对文件的直接读写。此过程分为三步:在用户虚拟地址空间中寻找空闲的满足要求的连续虚拟地址空间(由内核的mmap系统调用完成)、建立虚拟地址空间与文件或设备物理地址之间的映射(通过修改进程页表实现)、在实际访问新映射页面时的操作(由缺页中断完成)。详细描述包括页表管理、虚拟地址与物理地址的映射、缺页异常处理等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
上海青假黑斑病防治方法 上海青假黑斑病传播途径和发病条件 上海青细菌性黑斑病症状 治愈人心的早安句子(特别励志的早安心语) 打点滴针孔碰到水后血管发热疼痛是怎么回事 打点滴后一周后,手上的筋还肿痛,怎么办啊 打点滴后手肿了发青怎么回事 打点滴手很痛怎么办 番禺校最好的幼儿园有那几家 我想要弄个性签名档。怎么弄 Linux下轻松解决内存管理用内存清理命令linux内存清理命令 世界十大飞机排名 最大起飞重量按最大起飞重量排列的民用飞机列表 吴咏诗吴咏诗励志奨学金 女生有肠胃炎三餐吃什么比较利于病的恢复而又不会饿肚子~~ 肠胃炎三餐吃什么 急性肠胃炎吃什么食物最好? 身体健康表现为哪些方面 ? 福克斯是合资车还是国产车? 福克斯汽车是哪里产的 福克斯汽车是哪里产的? 福克斯是哪个国家的车 有什么夏季去临潼赏景的线路安利? 临潼有哪些很不错的美景地值得安利? 骊山有哪些小众风景地可以安利给游客? 山药猪蹄的做法,山药猪蹄怎么做好吃,山药猪蹄 猪蹄山药怎么做 鲈鱼还在蒸着吃吗教你几种做法好吃到停不下来 土豆你还在炒着吃吗?教你做凉拌土豆片,零难度,香脆可口还营养_百度知 ... 一天三餐吃三碗米饭炒土豆片和一个馒头能减肥么 伊宁市,是一个怎样的城市?有什么特色?有什么文化内涵啊? 春季伊宁旅游攻略大全 农村合作医疗保险没有在指定的医院治疗,而是在另一家更好的也是农村医疗... 农村医疗保险规定在乡级以上医院住院才给报销,我奶奶病重去不了医院里... ...割受伤已经有五十天了,手指无法握拳,而且,感觉手臂受伤处的皮肤和... ...以后手指关节往左凸了。不怎么痛,但是一握拳就痛。 ...筋断,右手三个手指筋断现在双手都不能完全握拳,可以办理残疾证吗s... ...筋断,右手三个手指筋断现在双手都不能完全握拳,可以办理残疾证吗... 奇门预测之后的决策 世界上较大的老虎是什么虎 派出所不受理微博造谣怎么办 微博上造谣报警可以吗? 成都出发适合春节自驾游的路线,成都春节旅游自驾游暖 春节期间,计划以保定为起点完成7天自驾游,有哪些路线值得推荐 苹果怎么用第三方图片做壁纸? 体重秤怎样校准体重秤不准的原因 显示器颜色太艳问题 HTC P4000 序号 名称 型号 备注 1 CPU AMD860K 三年 2 主板 七彩虹N68三年 3... 随身wifi是什么,有什么作用? 讯唐随身wifi是靠谱的吗?