嵌入式操作系统的内存,你了解多少?
linux 内存是后台开发人员,需要深入了解的计算机资源。合理的使用内存,有助于提升机器的性能和稳定性。本文主要介绍 linux 内存组织结构和页面布局,内存碎片产生原因和优化算法,linux 内核几种内存管理的方法,内存使用场景以及内存使用的那些坑。从内存的原理和结构,到内存的算法优化,再到使用场景,去探寻内存管理的机制和奥秘。
一、走进 linux 内存
1、内存是什么?
1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成
2)内存的特点是存取速率快
2、内存的作用
1)暂时存放 cpu 的运算数据
2)硬盘等外部存储器交换的数据
3)保障 cpu 计算的稳定性和高性能
二、 linux 内存地址空间
1、linux 内存地址空间 Linux 内存管理全貌
2、内存地址——用户态&内核态
-
用户态:Ring3 运行于用户态的代码则要受到处理器的诸多
-
内核态:Ring0 在处理器的存储保护中,核心态
-
用户态切换到内核态的 3 种方式:系统调用、异常、外设中断
-
区别:每个进程都有完全属于自己的,独立的,不被干扰的内存空间;用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用;内核态线程共享内核地址空间;
3、内存地址——MMU 地址转换
-
MMU 是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件
-
分段机制把一个逻辑地址转换为线性地址
-
分页机制把一个线性地址转换为物理地址
5、内存地址——分页机制(32 位)
-
分页机制是在分段机制之后进行的,它进一步将线性地址转换为物理地址
-
10 位页目录,10 位页表项, 12 位页偏移地址
-
单页的大小为 4KB
6、用户态地址空间
-
TEXT:代码段可执行代码、字符串字面值、只读变量
-
DATA:数据段,映射程序中已经初始化的全局变量
-
BSS 段:存放程序中未初始化的全局变量
-
HEAP:运行时的堆,在程序运行中使用 malloc 申请的内存区域
-
MMAP:共享库及匿名文件的映射区域
-
STACK:用户进程栈
7、内核态地址空间