物理内存管理

物理内存组织方式 SMP: CPU 通过总线访问内存, 称为 SMP 对称多处理器, 采用平坦内存模型, 物理页号连续, 总线成为瓶颈 NUMA: CPU 都有本地内存, 访问内存不用总线, 称为 NUMA 非一致内存访问 采用非连续内存模型,页号不连续 稀疏内存模型 下面以NUMA 为例. 节点 数据结构 pglist_data 表示 NUMA 节点 包括 id,page 数组,起始页号, 总页数, 可用页数 区域 zone 节点分为多个区域 zone ZONE_DMA; ZONE_NORMAL; ZONE_HIGHMEM, ZONE_MOVABLE 数据结构 zone 表示 区域 包含第一个页页号; 区域总页数; 区域实际页数; 被伙伴系统管理的页数; 用 per_cpu_pageset 区分冷热页(热页, 被 CPU 缓存的页) 页 数据结构 page 表示, 分配方式: 匿名页分配; 分配小块内存: Linux 采用 slab allocator 技术; 申请一整页, 分为多个小块存储池, 用队列维护其状态(较复杂) slub allocator 更简单 slob allocator 用于嵌入式 page 记录: 第一个 slab 对象; 空闲列表; 待释放列表 页分配 使用伙伴系统 进行管理分配 Linux 把空闲页分组为 11 个页块链表, 链表管理大小不同的页块(页大小 2^i * 4KB)

2019-11-03 · 1 min · 93 words

进程内存布局

内存管理包含: 物理内存管理 虚拟内存管理 物理内存与虚拟内存的映射 除了内存管理模块, 其他模块都使用虚拟地址(包括内核) 虚拟内存空间包含: 内核空间(高地址) 用户空间(低地址) +--------------+ | kernel space | high address +--------------+ ^ | stack | | +--------------+ | ^ | | user | | space | | v +--------------+ | heap | +--------------+ | bss | +--------------+ | | data | | +--------------+ | | text | v +--------------+ low address 空间存放内容 用户空间:多个进程看到的用户空间是独立的 从低到高布局为: 代码段 数据段 BSS段(未初始化静态变量) 堆 内存映射段 栈地址空间段 内核空间: 多个进程看到同一内核空间, 但内核栈每个进程不一样 内核代码也仅能访问内核空间 内核也有内核代码段, DATA 段, 和 BSS 段; 位于内核空间低地址 内核代码也是 ELF 格式, 只是所处的位置不同 内存映射 分段 虚拟地址 = 段选择子(段寄存器) + 段内偏移量 段选择子 = 段号(段表索引) + 标识位 段表 = 物理基地址 + 段界限(偏移量范围) + 特权等级 段表称为段描述符表, 放在全局标识符表中 Linux 将段基地址都初始化为 0, 不用于地址映射 Linux 分段功能主要用于权限检查 分页 物理内存被换分为大小固定(4KB)的页, 物理页可在内存与硬盘间换出/换入 ...

2019-10-25 · 1 min · 163 words