深入理解OS67内存管理:物理内存与虚拟内存实现原理

📅 2026/7/10 16:38:56
深入理解OS67内存管理:物理内存与虚拟内存实现原理
深入理解OS67内存管理物理内存与虚拟内存实现原理【免费下载链接】OS67An unix-like toy kernel项目地址: https://gitcode.com/gh_mirrors/os/OS67想要深入理解操作系统内核的底层原理吗OS67这个类Unix玩具内核为我们提供了一个绝佳的学习平台。作为一款面向学习者的操作系统内核OS67的内存管理系统设计精巧而实用涵盖了从物理内存分配到虚拟内存映射的完整实现。本文将带您深入探索OS67内存管理的核心机制揭示物理内存与虚拟内存的实现奥秘。 OS67内存管理系统架构概述OS67的内存管理系统采用了经典的分层设计物理内存管理PMM负责底层内存资源的分配与回收而虚拟内存管理VMM则构建了进程地址空间的抽象层。这种分离的设计使得内存管理更加模块化和可维护。在OS67中物理内存管理模块位于mm/pmm.c文件负责管理从0x100000地址开始的所有可用物理内存。虚拟内存管理模块则位于mm/vmm.c文件实现了页式内存管理和地址空间映射。 物理内存管理实现原理内存布局检测与初始化OS67通过BIOS中断0xe820获取系统内存布局信息这些信息在引导阶段由boot/bootsector.asm收集并存储在0x500地址处。物理内存管理器从内核结束地址kernend之后开始分配可用内存页面。// 内存区域描述符结构定义 struct ARD_entry_s { uint32_t base_addr_low; uint32_t base_addr_high; uint32_t len_low; uint32_t len_high; uint32_t type; }__attribute__((packed));页面栈管理机制OS67采用栈式管理物理内存页面这是一种简单而高效的分配策略。每个物理页面大小为4KB0x1000字节最大支持512MB内存。#define PMM_PAGE_SIZE 0x1000 #define PMM_MAX_SIZE 0x20000000 // 512M #define PAGE_MAX_SIZE (PMM_MAX_SIZE/PMM_PAGE_SIZE) static uint32_t pmm_stack[PAGE_MAX_SIZE 1]; static uint32_t pmm_stack_top 0;内存分配与回收算法物理内存的分配和释放操作非常简洁高效。分配时从栈顶弹出一个页面地址释放时将页面地址压入栈中。uint32_t pmm_alloc(){ uint32_t addr pmm_stack[--pmm_stack_top]; assert(pmm_stack_top 0,pmm_alloc: no physical page); memset((void *)addr, 0, PAGE_SIZE); return addr; } void pmm_free(uint32_t addr){ pmm_stack[pmm_stack_top] addr; } 虚拟内存管理核心技术页表结构设计OS67采用二级页表结构支持4GB地址空间。每个页目录项PDE指向一个页表每个页表项PTE映射一个4KB的物理页面。/* 32位虚拟地址划分 */ #define PDE_INDEX(x) (((x) 22) 0x3ff) // 页目录索引 #define PTE_INDEX(x) (((x) 12) 0x3ff) // 页表索引 #define OFFSET_INDEX(x) ((x) 0xfff) // 页内偏移内核页表初始化系统启动时内核建立恒等映射identity mapping将虚拟地址0-4GB直接映射到相同的物理地址。这种设计简化了内核启动过程。void vmm_init(){ uint32_t i, j; // 建立4GB内存的恒等映射 for (i 0, j 0; i PTE_COUNT; i, j){ pgd_kern[i] (uint32_t)pte_kern[j] | PTE_P | PTE_R | PTE_K; } uint32_t *pte (uint32_t *)pte_kern; for (i 1; i PTE_COUNT*PTE_SIZE; i){ pte[i] (i 12) | PTE_P | PTE_P | PTE_K; } vmm_switch_pgd((uint32_t)pgd_kern); vmm_enable(); }地址空间映射机制虚拟内存映射函数vmm_map实现了灵活的地址空间管理支持用户空间和内核空间的不同映射策略。void vmm_map(pde_t *pgdir, uint32_t va, uint32_t pa, uint32_t flags){ uint32_t pde_idx PDE_INDEX(va); uint32_t pte_idx PTE_INDEX(va); pte_t *pte (pte_t *)(pgdir[pde_idx] PAGE_MASK); if (!pte){ if (va USER_BASE){ pte (pte_t *)pmm_alloc(); memset(pte, 0, PAGE_SIZE); pgdir[pde_idx] (uint32_t)pte | PTE_P | flags; } else { pte (pte_t *)(pgd_kern[pde_idx] PAGE_MASK); pgdir[pde_idx] (uint32_t)pte | PTE_P | flags; return; } } pte[pte_idx] (pa PAGE_MASK) | PTE_P | flags; } 进程地址空间管理用户虚拟内存初始化每个进程都有独立的页目录用户空间从0xc0000000地址开始。进程创建时内核为其分配初始的地址空间。void uvm_init_fst(pde_t *pgdir, char *init, uint32_t size){ char *room; assert(size PAGE_SIZE, uvm_init_fst: size); room (char *)pmm_alloc(); memset(room, 0, PAGE_SIZE); memcpy(room, init, size); vmm_map(pgdir, USER_BASE, (uint32_t)room, PTE_U | PTE_P | PTE_R); }地址空间切换机制进程切换时通过加载新的页目录基址寄存器CR3实现地址空间的快速切换。inline void vmm_switch_pgd(uint32_t pde){ __asm__ volatile (mov %0, %%cr3: :r(pde)); }页面错误处理OS67实现了完整的页面错误异常处理机制当访问未映射或权限不足的内存时会触发中断14页面错误。void page_fault(struct int_frame *r){ // 页面错误处理逻辑 // 包括缺页处理、权限检查等 }️ 内存管理实用工具函数地址对齐操作OS67提供了方便的地址对齐宏确保内存操作的正确性。#define PAGE_ALIGN_DOWN(x) ((x) PAGE_MASK) #define PAGE_ALIGN_UP(x) (((x) PAGE_SIZE - 1) PAGE_MASK)内存属性定义系统定义了丰富的页面属性标志支持灵活的内存保护机制。#define PTE_P 0x1 // 页面存在 #define PTE_R 0x2 // 可读/可写 #define PTE_U 0x4 // 用户空间页面 #define PTE_K 0x0 // 内核空间页面 #define PTE_W 0x8 // 写直达 #define PTE_D 0x10 // 缓存禁用 #define PTE_A 0x20 // 已访问 内存管理性能优化技巧页面缓存刷新为了提高性能OS67在修改页表后使用invlpg指令刷新TLB缓存。static inline void vmm_reflush(uint32_t va){ __asm__ volatile (invlpg (%0)::a(va)); }内存分配策略优化物理内存管理器采用栈式管理分配和释放操作都是O(1)时间复杂度确保了高性能。同时分配时自动清零页面内容提高了安全性。 调试与监控功能内存信息显示OS67提供了详细的内存信息显示功能帮助开发者了解系统内存使用情况。void pmm_mem_info(){ printl( display memory info start \n); printl(MEMORY: 1, RESERVED: 2, UNDEFINE: 3\n); // 显示内存布局信息 }日志输出控制通过__LOG_ON宏可以控制内存管理模块的日志输出便于调试。// #define __LOG_ON 1 // 取消注释启用日志 总结与学习建议OS67的内存管理系统虽然相对简单但涵盖了操作系统内存管理的核心概念物理内存管理栈式分配、页面大小4KB、最大512MB支持虚拟内存管理二级页表、恒等映射、用户/内核空间分离进程地址空间独立页目录、按需分配、页面错误处理性能优化TLB刷新、O(1)分配算法对于学习操作系统开发的初学者建议从以下路径深入首先理解mm/pmm.c中的物理内存管理逻辑然后研究mm/vmm.c中的虚拟内存映射机制最后分析proc/目录下的进程地址空间管理通过研究OS67的内存管理实现您不仅能够理解现代操作系统内存管理的基本原理还能掌握实际的内核开发技巧。这个简洁而完整的实现是学习操作系统内存管理的绝佳教材。记住理解内存管理是掌握操作系统内核开发的关键一步。OS67用最少的代码实现了最核心的功能是深入理解操作系统内存管理机制的完美起点。【免费下载链接】OS67An unix-like toy kernel项目地址: https://gitcode.com/gh_mirrors/os/OS67创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考