本节思考:
在系统启动时,ARM Linux
内核如何知道系统中有多大的内存空间?
在32bit Linux
内核中,用户空间和内核空间的比例通常是3:1
,可以修改成2:2
吗?
物理内存页面如何添加到伙伴系统中,是一页一页添加,还是以2
的几次幂来加入呢?
在内存管理的上下文中, 初始化(initialization
)可以有多种含义.在许多CPU
上,必须显式设置适用于Linux
内核的内存模型.在x86_32
上需要切换到保护模式, 然后内核才能检测到可用内存和寄存器.
在初始化过程中, 还必须建立内存管理的数据结构,以及很多事务.因为内核在内存管理完全初始化之前就需要使用内存.
在系统启动过程期间,使用了额外的简化的内存管理模块,然后在初始化完成后,将旧的模块丢弃掉.
对相关数据结构的初始化是从全局启动函数start_kernel
中开始的,该函数在加载内核并激活各个子系统之后执行.
由于内存管理是内核一个非常重要的部分,因此在特定体系结构的设置步骤中检测并确定系统中内存的分配情况后, 会立即执行内存管理的初始化.
现在大部分计算机使用DDR
(Dual Data Rate SDRAM
)的存储设备,DDR
包括DDR3L
、DDR4L
、LPDDR3/4
等。
DDR
初始化一般在BIOS
或boot loader
中,BIOS
或boot loader
将DDR
大小传给内核,因此从Linux
内核角度看其实就是一段物理内存空间。
1. 内存管理概述
分层描述的话,内存空间可以分为3
个层次,分别是用户空间层、内核空间层和硬件层。如图2.1。
图2.1 内存管理框图:
用户空间和内核空间的接口是系统调用,因此内核空间层首先需要处理这些内存管理相关的系统调用,例如sys_brk
、sys_mmap
、sys_madvise
等。
接下来就包括VMA
管理、缺页中断管理、匿名页面、page cache
、页面回收、反向映射、slab
分配器、页表管理等模块了。
最下面是硬件层,包括处理器的MMU
、