哪里有做网站的公司深圳市有方科技有限公司
哪里有做网站的公司,深圳市有方科技有限公司,网站开发视频压缩上传,做设计的什么网站能挣钱内核地址映射的生命周期核心是#xff1a;“按需建立 → 稳定使用 → 按规则释放”#xff0c;但不同类型的内存映射#xff0c;生命周期的触发条件、管理方式差异极大。
先明确两个基础分类#xff0c;后续所有生命周期都围绕这两类展开#xff1a;
映射类型核心特征典…内核地址映射的生命周期核心是“按需建立 → 稳定使用 → 按规则释放”但不同类型的内存映射生命周期的触发条件、管理方式差异极大。先明确两个基础分类后续所有生命周期都围绕这两类展开映射类型核心特征典型用途生命周期特点永久映射启动时建立终身不释放kmalloc 分配、内核镜像随内核启动而建关机才毁临时映射动态建立 / 释放用完即回收vmalloc、高端内存随内存分配 / 释放动态变化永久映射内核直接映射区—— 生命周期最长这类映射是内核最基础的地址映射覆盖 64 位系统全部物理内存、32 位系统 LOWMEM 区≤896MB。建立阶段内核启动时触发时机内核启动的setup_arch()阶段架构相关初始化核心操作遍历物理内存页框为每一页建立虚拟地址→物理地址的页表项一级 / 二级页表32 位系统直接映射区虚拟地址 PAGE_OFFSET0xC0000000 物理地址64 位系统直接映射区虚拟地址固定在0xffff880000000000开始与物理地址线性对应代码佐证简化// 内核启动时建立直接映射arm64 示例 void __init map_mem(void) { // 遍历物理内存范围建立页表映射 create_pgd_mapping(swapper_pg_dir, PHYS_OFFSET, VA_OFFSET, mem_size, PAGE_KERNEL); }使用阶段内核运行全程所有通过kmalloc()、get_free_pages()分配的内存都使用这类永久映射映射始终有效无需手动维护内核可直接通过虚拟地址访问物理内存即使调用kfree()释放内存映射仍保留仅物理内存标记为空闲。释放阶段永久映射不会在运行时释放只有系统关机 / 重启时硬件层面的页表才会被清空这也是kfree()无需处理映射的核心原因 —— 映射本身是 “终身制” 的。临时映射动态映射—— 生命周期灵活这类映射是为了解决 “永久映射覆盖范围不足” 的问题如 32 位高端内存、非连续物理内存分配生命周期完全由内核动态管理。子场景 1vmalloc 映射非连续物理内存对应vmalloc()/vfree()是最常见的临时映射建立阶段触发时机调用vmalloc(size)时核心操作① 在内核 VMALLOC 区如 64 位0xffffc90000000000分配一段连续的虚拟地址② 分配若干离散的物理页框③ 为每个物理页框建立页表项虚拟→物理映射④ 刷新 TLB快表确保映射生效。代码逻有序列表辑简化void *vmalloc(unsigned long size) { struct vm_struct *vm; // 1. 分配虚拟地址区间 vm __get_vm_area(size, VM_ALLOC); // 2. 分配物理页 alloc_vmalloc_pages(vm); // 3. 建立页表映射 map_vmalloc_range(vm); // 4. 刷新 TLB flush_tlb_kernel_range(vm-addr, vm-addr vm-size); return vm-addr; }使用阶段映射在vfree()调用前始终有效内核可通过虚拟地址访问离散的物理内存注意vmalloc 映射的内存访问效率略低需两次页表查找仅用于大内存分配如 PAGE_SIZE。释放阶段触发时机调用vfree(addr)时核心操作① 找到虚拟地址对应的vm_struct结构体② 清除页表项释放映射③ 刷新 TLB确保映射失效④ 释放物理页框⑤ 回收虚拟地址区间供后续 vmalloc 复用。子场景 2高端内存临时映射仅 32 位系统对应kmap()/kunmap()解决 32 位系统 LOWMEM 不足的问题建立阶段触发时机调用kmap(page)时page 是高端内存页核心操作① 从内核预留的 “临时映射窗口”如 0xFFFF0000 开始分配一个虚拟地址② 为该虚拟地址建立指向高端内存页的页表项③ 刷新 TLB。使用阶段映射是 “独占” 的同一时间只能有一个高端内存页映射到同一个窗口必须尽快使用用完立即释放避免阻塞其他进程。释放阶段触发时机调用kunmap(page)时核心操作① 清除临时映射窗口的页表项② 刷新 TLB③ 释放虚拟地址窗口供后续 kmap 复用④ 可选调用__free_pages(page)释放物理页映射释放 ≠ 内存释放。特殊场景用户态地址映射补充用户态映射的生命周期能更清晰区分内核 / 用户态的差异建立mmap()系统调用 / 进程加载时缺页异常触发使用进程运行期间映射随进程地址空间存在释放munmap()/ 进程退出内核自动清理页表。阶段 1映射 “声明”虚拟地址区间预留这一步仅分配虚拟地址区间不创建实际页表项是映射的 “预备阶段”。触发时机进程启动时加载可执行文件内核为代码段、数据段、bss 段预留虚拟地址调用mmap()系统调用主动申请映射如文件映射、匿名映射堆扩容brk()/sbrk()系统调用扩展堆的虚拟地址区间栈自动扩容栈溢出触发内核栈扩展逻辑。核心操作内核为进程创建 / 修改vm_area_structVMA记录映射的虚拟地址范围、权限读 / 写 / 执行、映射类型文件 / 匿名等但页表项仍为空。阶段 2映射 “生效”缺页异常创建页表项这是用户态映射最核心的 “惰性建立” 环节 —— 只有首次访问预留的虚拟地址时才真正创建页表项。触发时机CPU 访问 “已声明但未实际映射” 的虚拟地址触发缺页异常Page Fault。核心操作内核缺页异常处理函数do_page_fault()检查虚拟地址是否属于进程的 VMA 区间非法地址则触发段错误 SIGSEGV根据 VMA 类型创建物理页 页表项匿名映射堆 / 栈 /mmap 匿名分配物理页建立虚拟地址→物理页的映射页表项文件映射可执行文件 /so 库从文件读取数据到物理页建立映射按需加载设置页表项权限如代码段只读、数据段可读写刷新 TLB快表确保映射生效回到用户态重新执行触发缺页的指令此时访问正常。关键特点用户态映射是 “用多少建多少”而非一次性创建全部页表项大幅节省物理内存。阶段 3映射 “修改”可选按需调整运行过程中映射可被动态修改核心是更新页表项或 VMA 信息触发时机调用mprotect()修改映射权限如把只读映射改为可写写时复制COW父子进程共享映射子进程首次写时内核分配新物理页、更新页表项内存交换Swap物理页被换出到交换分区时页表项标记为 “交换态”页被换入时恢复正常映射。核心操作修改页表项属性权限 / 物理页指向 刷新 TLB。阶段 4映射 “失效 / 释放”主动 / 被动销毁映射的释放分 “主动调用” 和 “被动触发” 两种最终都会清除页表项并回收资源子场景 1主动释放用户态调用触发时机调用munmap()释放指定虚拟地址区间的映射堆缩容brk()/sbrk()传入更小的地址。核心操作清除对应虚拟地址的页表项刷新 TLB让映射失效回收物理页匿名映射或解除文件关联文件映射删除对应的 VMA 结构体。子场景 2被动释放内核触发触发时机进程退出正常退出 / 信号终止内核自动清理整个进程的地址空间进程执行execve()替换可执行文件旧地址空间的所有映射被释放内存不足OOM内核杀死进程后清理映射。核心操作内核遍历进程的所有 VMA逐一清除页表项、回收物理页 / 文件关联最终销毁mm_struct。用户态 vs 内核态映射生命周期对比维度用户态映射内核态永久映射kmalloc内核态临时映射vmalloc建立时机缺页异常时惰性建立内核启动时一次性建立vmalloc () 调用时主动建立生命周期绑定进程生命周期 / 主动调用内核运行周期关机才释放vmalloc () → vfree () 周期隔离性进程隔离每个进程独立页表内核全局共享内核全局共享释放触发munmap ()/ 进程退出永不释放vfree () 主动调用总结永久映射直接映射区生命周期 内核运行周期启动时建立、关机时销毁kfree 仅释放物理内存不影响映射临时映射vmalloc / 高端内存生命周期 内存分配→释放周期映射由vmalloc()/kmap()建立vfree()/kunmap()释放且映射释放和物理内存释放是两个独立操作核心原则内核地址映射的生命周期由「内存分配方式」决定而非单纯的 “内存释放”kfree映射的建立 / 释放必须和分配方式严格匹配如 vmalloc 对应 vfree混用会导致内核崩溃。