Linux中内存管理
内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。
虚拟地址的作用如果用户进程直接操作物理地址会有以下的坏处:1、 用户进程可以直接操作内核对应的内存,破坏内核运行。2、 用户进程也会破坏其他进程的运行CPU 中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。所以,Linux内存管理涉及到了以下三个部分:1、物理内存
物理内存的组织
Linux 中内存分为 3 个级别,从下到上依次为:1>、Page: 一个 page 的大小为 4k, Page 是内存的一个最基本的单位。2>、Zone: Zone 中提供了多个队列来管理 page。Zone分为 3 种2.1、 ZONE_DMA:用来存放 DMA 读取 IO 设备的数据,内核专用2.2、 ZONE_NORMAL:用来存放内核的相关数据,内核专用2.3、 ZONE_HIGHMEM:高端内存,用来存放用户进程数据3>、Node 节点,一个 CPU 对应着一个 Node,一个 Node 包括一个 Zone_DMA、 ZONE_NORMAL、ZONE_HIGHMEM。同时当一个 CPU 对应的内存用光后,可以申请其他 CPU 对应的内存。
物理内存的分配
Linux将内存分配分为两种:1>、大内存大内存 利用伙伴系统 分配。

2、如何组织虚拟地址
虚拟地址对应的是虚拟空间,虚拟空间只不过是一个虚拟地址的集合,用来映射物理内存。


动态映射分为三种:1>、动态内存映射: 使用完对应的物理内存后,就可以映射其他物理内存了。2>、永久内存映射: 一个虚拟地址只能映射一个物理地址。如果需要映射其他物理地址,需要解绑。3>、固定内存映射: 只能被某些特定的函数来调用引用物理地址。动态内存映射和直接映射的区别动态映射和直接映射的区别就是逻辑地址到物理地址的转化规则。直接映射直接映射的规则是死的,一个逻辑地址对应的物理地址是固定的。通过逻辑地址加或者减去一个数,就可以得到对应的物理地址。动态映射动态映射是动态的绑定,每个逻辑地址对应的物理地址是动态的,通过页表进行查询。用户空间映射:用户空间采用动态映射,每个虚拟地址可以被映射到一个物理地址,映射到ZONE_HIGHMEM。为什么用户空间不采用直接映射呢?因为物理内存是多个进程所有的,每个进程都有一个用户空间。如果采用直接映射的话,对应的物理地址是会冲突的。其用户空间的逻辑地址大小都为 3G,所以存在逻辑地址相同,但是对应的物理地址不同。需要通过页表来转化,一个进程会对应一个页表。
3、如何将虚拟地址映射到物理内存
虚拟地址通过 页表 将 虚拟地址 转化为 物理地址,每个进程都对应着一个页表,内核只有一个页表。虚拟空间 和 物理内存 都按照 4k 来分页,一个虚拟空间中的页 和 物理内存中页 是 一一对应的。页表映射




TLB
TLB 就是一个缓存,放在 CPU 中。用来将虚拟地址和对应的物理地址进行缓存。当查询对应的物理地址的时候,首先查询 TLB,如果TLB中存在对应的记录,就直接返回。如果不存在,就再去查询页表。虚拟内存
虚拟内存 指的是 将硬盘中划出一段 swap 分区 当作 虚拟的内存,用来存放内存中暂时用不到的内存页,等到需要的时候再从 swap 分区中 将对应的内存页调入到 内存中。硬盘此时相当于一个虚拟的内存。从逻辑上能够运行更大内存的程序,因为程序运行的时候并不需要把所有数据都加载到内存中,只需要将当前运行必要的相关程序和数据加载到内存中就可以了,当需要其他数据和程序的时候,再将其调入。相较于真正的内存加载,虚拟内存需要将数据在内存和磁盘中不断切换,这是一个耗时的操作,所以速度比不上真正的内存加载。总结
虚拟空间 和 物理内存 都分为 内核空间 和 用户空间。虚拟地址需要通过页表转化为物理地址,然后才能访问。用户虚拟空间 只能映射 物理内存中的用户内存,无法映射到物理内存中的内核内存,也就是说,用户进程只能操作用户内存。内核空间 只能被 内核 申请使用,用户进程只能操作用户空间的物理内存和虚拟空间。当用户进程 调用系统调用的时候,会将其对应的代码和数据运行在内核空间中。所以当调用 内核空间 读取文件或者网络数据的时候,首先会将数据拷贝到内存空间,然后在将数据从内核空间拷贝到用户空间。因为 用户进程不能访问内核空间。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5161文章
19783浏览量
319613 -
Linux
+关注
关注
88文章
11535浏览量
214857 -
内存管理
+关注
关注
0文章
169浏览量
14615
原文标题:嵌入式Linux中内存管理详解
文章出处:【微信号:嵌入式开发爱好者,微信公众号:嵌入式开发爱好者】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
嵌入式Linux应用开发详解 光盘
第2章,主要介绍嵌入式Linux的基本知识和如何配置嵌入式Linux开发环境;第二篇为系统篇,包括第3-7章,主要介绍了uClinux操作系统相关的知识,如任务
发表于 06-02 10:26
嵌入式系统内存管理
本帖最后由 VVX 于 2016-9-18 13:15 编辑
1、概述操作系统的内存管理功能用于向操作系统提供一致的地址映射功能和内存页面的申请、释放操作。在嵌入式实时系统
发表于 09-17 19:40
嵌入式学习路线 嵌入式学习路线详解
,编写一个守护进程程序,sleep系统调用任务管理、同步与通信Linux任务概述任务调度管道、信号共享内存,任务管理 API,了解Linux
发表于 03-17 18:05
评论