Linux 0.11 源码阅读笔记-内存的基础概念
总览
- Linux 0.11 源码阅读笔记-总览
- Linux 0.11 源码阅读笔记-内存的基础概念
- Linux 0.11 源码阅读笔记-启动程序
- Linux 0.11 源码阅读笔记-内核代码
- Linux 0.11 源码阅读笔记-设备驱动程序
- Linux 0.11 源码阅读笔记-文件系统
- Linux 0.11 源码阅读笔记-内存管理
Linux 内存的基础概念
内存条的分配
Linux0.11 对物理内存条的分配
内核模块
, Linux Kernel的代码高速缓冲 Buffer
, 缓存内核对硬盘的读写操作. 仅部分内核函数可用主内存 Memory
, 应用程序可用的内存区. 虚拟内存也是针对这一块区域而言的.
内存的几个概念
- Virtual Memory
linux 0.11内核中, 每个程序都划分了总容量为64Mb的虚拟内存空间 - Logical Address
程序在虚拟内存空间的偏移量就是逻辑地址, 范围是0x0000000-0x4000000 - Linear Address
在内存分段机制中, 把相应的段基址加上逻辑地址就是线性地址. 若没有开启分页功能, 直接就是物理地址.
分段机制虽然保证了程序内存的相互隔离, 但是对内存的使用效率是非常低的!
80x86 实时模式下, 寻址采用的是段和偏移值. 无分页机制.
80x86 保护模式下, 会启用分页机制, 需要使用描述表(Descriptor Table) - Physical Address
真正的内存物理地址, 从逻辑地址到物理地址, 需要经过分段和分页两次转换. - 分段机制
- 相关概念有, GDT(全局描述符表), LDT(局部描述符表)
- Linux基本忽略了分段机制, 通过”欺骗”, 使得逻辑地址与线性地址是一致的! (用GDT, 基地址为0)
- 分页机制
- 相关概念有 Page Directory(页目录), Page Table(页表)
- 新版的linux, 为了提高兼容性, 直接采用了4级分页机制:
- 页全局目录, Page Global Directory, 对应80x86的 Page Directory
- 页上级目录, Page Upper Directory, 长度设为0即可
- 页中间目录, Page Middle Directory, 长度设为0即可
- 页表, Page Table, 对应80x86的 Page Table
- 任务状态段
- TSS (Task State Segment)
- TSS包含了所有硬件切换任务时, 需要保存的寄存器信息.
- TSS存放于GDT内
内存地址的转换
从逻辑地址变换为物理地址的过程
从逻辑地址变化为物理地址的框图
逻辑地址转换为线性地址的过程
线性地址(页目录项, 页表项)在内存中位置
页目录(Page Directory), 页表(Page Table)和物理内存的关系图
进程代码和数据在其逻辑地址空间中的分布 (在物理地址中的分布是随机)
linux 使用描述符表的示意图
任务1在三种地址空间中的关系
80x86 多任务
- Intel 80x86分为4个保护级别, Linux 0.11只使用了0和3两个保护级别.
- 0为最高优先级, 对应于Linux内核态
- 3为最低优先级, 对应于Linux用户态
- 这样划分主要是为了安全考虑进行的系统级别的隔离.
- 用户态无权直接使用硬件资源, 必须通过调用内核函数.
- 多任务间, 内存是完全隔离的, 因此任务之间不会相互影响.
linux 的多任务及保护方式
linux 任务切换操作示意图
参考
原创于 DRA&PHO