进程间通信笔记(8)—mmap详解

本文详细探讨了Linux中的mmap技术,从进程空间分布、内核空间与用户空间的划分,到进程的内存布局,然后重点介绍了mmap的工作原理、编程接口及其在进程间通信中的应用。通过mmap,可以避免用户态到内核态的数据拷贝,提高效率。同时,文章还分析了可能导致bus error的原因,并提供了参考资料链接。
摘要由CSDN通过智能技术生成

这一次要彻底理解linux mmap。

最早接触mmap是在大四的一个嵌入式项目,将3730的物理内存关联到进程空间,用作进程间通信的共享缓冲,存放参数、视频帧等。时间过去了两年,虽然当时也大概了解,不过一直没有系统的学习(水了两篇博客)。这次就好好看看(从用户态到内核态)

前3部分为基础知识,后面将具体介绍mmap。

1.进程空间分布

对于一个进程,其空间分布如下图所示:

这里写图片描述

程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码。
初始化过的数据(Data):在程序运行初已经对变量进行初始化的数据,例如初始化过的全局变量和静态变量。
未初始化过的数据(BSS):在程序运行初未对变量进行初始化的数据,例如未初始化的全局变量和静态变量。
栈 (Stack):存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
堆 (Heap):存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。
注:Text, BSS, Data段在编译时已经决定了进程将占用多少VM


2.内核空间和用户空间

对于32bits操作系统来说,Linux的虚拟地址空间范围为0~4G(0~3G为用户空间,3~4G为内核空间),Linux内核将这4G字节的空间分为两部分,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF)供各个进程使用,称为“用户空间”。

这里写图片描述

问:有的物理内存只有几百M,为什么进程的寻址空间却有这么大?
答:这就是使用了虚拟地址的好处,通常我们使用一种叫做虚拟内存的技术来实现,因为可以使用硬盘中的一部分来当作内存使用 。


3.进程的内存布局

Linux进程标准的内存段布局,如下图所示,地址空间中的各个条带对应于不同的内存段(memory segment),如:堆、栈之类的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值