内核代码阅读(3) - 内存管理的基本框架

简介: 内存管理的基本框架

Linux 内存管理的基本框架

内核中的3层映射

为了同时兼顾32位,64位CPU,内核的映射机制设计成3层。

PGD, PMD, PT(PTE)

内核中3层映射是如何在i386CPU转换成了2层映射?

#if CONFIG_X86_PAE
   # include <asm/pgtable-3level.h>
   #else
   # include <asm/pgtable-2level.h>
   #endif

在i386中直接include了pgtable-2level.h。

架构相关的代码集中在h文件中,然后根据设置的宏进行选择。

另外,

#define PGDIR_SHIFT 22 //PGDIR 从22位到32位

#define PTRS_PER_PGD 1024 //一个PGDIR 的空间是1024个PMD

#define PMD_SHIFT 22 // PMD 也是从22位开始 [PMD, PGDIR) 正好是0个bit位。

#define PTRS_PER_PMD 1

虚拟地址划分

32位的虚拟地址,空间大小是4G。
内核把最高的1G分配给内核使用 [0xCFFFFFFF ,0xFFFFFFFF)
用户空间的虚拟地址[0, 0xBFFFFFFF)

内核空间的地址映射

内核的虚拟地址占据最高的1G,但是物理地址是固定的从0开始。所以,内核的虚拟地址到物理地址的映射很简单减去3G (0xC0000000)
#define __PAGE_OFFSET        (0xC0000000)
#define PAGE_OFFSET        ((unsigned long)__PAGE_OFFSET)
#define __pa(x)            ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x)            ((void *)((unsigned long)(x)+PAGE_OFFSET))
可以看到:
    内核虚拟地址到物理的翻译直接减去PAGE_OFFSET  _pa(x)
而反向映射的宏__va(x) 则加上PAGE_OFFSET
同时,PAGE_OFFSET 也代表用户空间的上限(processor.h)。
/*
 * User space process size: 3GB (default).
 */
#define TASK_SIZE    (PAGE_OFFSET)

地址映射的全过程

段式映射

由于i386同时支持段和页,所以地址映射必须走一遍段映射。

linux是如何饶过段式映射的?

1) 创建一个进程的时候给所有进程的段寄存器的赋值一样

#define start_thread(regs, new_eip, new_esp) do {        \
__asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));    \
set_fs(USER_DS);                    \
regs->xds = __USER_DS;                    \
regs->xes = __USER_DS;                    \
regs->xss = __USER_DS;                    \
regs->xcs = __USER_CS;                    \
regs->eip = new_eip;                    \
regs->esp = new_esp;                    \
 } while (0)

2) 再看__USER_DS和__USER_CS的定义

#define __KERNEL_CS    0x10
 #define __KERNEL_DS    0x18
 #define __USER_CS    0x23
 #define __USER_DS    0x2B
 这4个值就是段寄存器的值,而他们的TI位都是0,都用GDT表。
 而高13位依次是2,3,4,5. 所以当前进程所用的段描述符都是在全局的段描述符的2,3,4,5项。

3) 再看全局段描述符表的初始化

ENTRY(gdt_table)
.quad 0x0000000000000000    /* NULL descriptor */
.quad 0x0000000000000000    /* not used */
.quad 0x00cf9a000000ffff    /* 0x10 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff    /* 0x18 kernel 4GB data at 0x00000000 */
.quad 0x00cffa000000ffff    /* 0x23 user   4GB code at 0x00000000 */
.quad 0x00cff2000000ffff    /* 0x2b user   4GB data at 0x00000000 */
  从注释可以看到2,3为kernel的段描述符;4,5为用户进程的段描述符。
  这些描述的base都是0,至此解释了代码中的虚拟地址经过段式映射之后还是自身。

页式映射

CR3里保存当前进程的PGD值。进程切换要初始化CR3寄存器。
asm volatile ("movl %0 %%cr3": : "r"(__pa(next->pgd)))
相关文章
|
5月前
|
算法 安全 Linux
探索Linux内核的虚拟内存管理
【5月更文挑战第20天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分之一——虚拟内存管理。通过剖析其关键组件和运作机制,揭示虚拟内存如何提供高效的内存抽象,支持庞大的地址空间,以及实现内存保护和共享。文章将重点讨论分页机制、虚拟内存区域(VMAs)的管理、页面置换算法,并简要分析这些技术是如何支撑起现代操作系统复杂而多变的内存需求的。
|
2月前
|
算法 安全 UED
探索操作系统的内核空间:虚拟内存管理
【7月更文挑战第50天】 在现代操作系统中,虚拟内存管理是核心功能之一,它允许操作系统高效地使用物理内存,并为应用程序提供独立的地址空间。本文将深入探讨操作系统虚拟内存管理的机制,包括分页、分段以及内存交换等关键技术,并分析它们如何共同作用以实现内存的有效管理和保护。通过理解这些原理,读者可以更好地把握操作系统的内部工作原理及其对应用程序性能的影响。
|
3月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
47 1
|
3月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
45 0
|
3月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
45 0
|
3月前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
27 0
|
3月前
|
存储 算法 安全
Java面试题:给定一个可能产生内存泄漏的场景,如何诊断并解决?实现一个生产者-消费者模型,使用适当的同步机制与并发工具类,Java并发工具包与框架:性能与调优
Java面试题:给定一个可能产生内存泄漏的场景,如何诊断并解决?实现一个生产者-消费者模型,使用适当的同步机制与并发工具类,Java并发工具包与框架:性能与调优
25 0
|
3月前
|
存储 并行计算 安全
Java面试题:Java内存管理、多线程与并发框架的面试题解析与知识点梳理,深入Java内存模型与垃圾回收机制,Java多线程机制与线程安全,Java并发工具包与框架的应用
Java面试题:Java内存管理、多线程与并发框架的面试题解析与知识点梳理,深入Java内存模型与垃圾回收机制,Java多线程机制与线程安全,Java并发工具包与框架的应用
58 0
|
5月前
|
数据采集 人工智能 测试技术
3倍生成速度还降内存成本,超越Medusa2的高效解码框架终于来了
【5月更文挑战第21天】CLLM,一种新方法,通过并行解码提升大型语言模型推理速度3-4倍,降低内存成本,超越Medusa2。采用Jacobi解码和微调策略,保证生成质量。无需修改模型架构,训练成本低,可与现有技术集成。但依赖高质量数据集,更大数据集可提高泛化能力。[链接](https://arxiv.org/pdf/2403.00835)
58 2
|
5月前
|
机器学习/深度学习 算法 Linux
xenomai内核解析--实时内存管理--xnheap
Xenomai是一个实时操作系统(RTOS)层,用于Linux,旨在提供确定性的任务调度和服务。其内存管理机制包括一个名为xnheap的内存池,确保内存分配和释放的时间确定性,以满足硬实时系统的严格需求。
148 0
xenomai内核解析--实时内存管理--xnheap

热门文章

最新文章

下一篇
无影云桌面