483|0

222

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

奔跑吧Linux内核+内存与MMAP/MALLOC [复制链接]

在《奔跑吧Linux内核》这本书中,关于虚拟内存管理以及进程地址空间的探讨是深入且关键的。虚拟内存管理是现代操作系统中的核心概念,它使得每个进程仿佛拥有独立的、连续的地址空间,即使物理内存是有限的。而进程地址空间则是每个进程所看到的虚拟内存布局。

 

 

在64位系统中,每个用户进程拥有庞大的虚拟地址空间,通常远超物理内存大小。管理这些虚拟地址空间的关键在于有效映射和管理离散的内存块。进程通过系统调用如mallocmmap来在虚拟地址空间中分配内存块,这些操作在内核中通过相应的机制实现。

 

内存区域是进程地址空间的重要组成部分,它们包含了程序执行所需的各种数据段和代码段。在Linux内核中,每个进程都有一套独立的内存区域,这些区域通过vm_area_struct数据结构来描述,并受到严格的管理和权限控制。

 

 

在Linux系统中,malloc()函数是C语言标准库提供的一个用于动态内存分配的函数。对于初学者来说,理解malloc()如何在不同进程间工作是很重要的。

 

 

malloc()函数为进程提供了一个简单的方式来分配动态内存,而无需直接处理复杂的系统调用或内存管理细节。不同的进程调用malloc()时,是在它们各自独立的地址空间中进行的,因此不会有内存重叠的问题。brk()等系统调用在内部可能被使用,但通常是由malloc()等库函数来封装和调用的,以提供更高级的抽象和易用性。

 

 

 

在Linux操作系统中,每个用户进程都拥有自己独立的地址空间,并且这些地址空间是通过页表来映射到物理内存的。即使两个进程在printf输出时显示它们通过malloc获得的虚拟地址相同,这些地址实际上在内核中对应于两个完全不同的物理内存区域,或者可能是两个完全不同的页表项,它们指向的是不同的物理帧。

 

 

 

mmap机制在Linux内核中的实现确实比brk机制要复杂得多,因为它提供了更多的灵活性和功能。mmap允许进程将一个文件或者其它对象映射进自己的地址空间,实现共享内存、文件I/O、设备驱动等多种功能。与brk不同,mmap可以映射任意大小、任意位置的内存区域,并且可以指定不同的保护标志。

在Linux内核中,mmap的实现涉及到多个关键的数据结构和函数。其中,vm_area_struct(VMA)是一个核心的数据结构,用于表示进程地址空间中的一个连续内存区域。每个VMA都包含有关该区域的起始地址、长度、保护标志、映射的文件等信息。

此帖出自Linux开发论坛
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表