当前位置: 首页 > article >正文

Linux 内核中的内存管理:从物理内存到虚拟内存

Linux 内核中的内存管理从物理内存到虚拟内存引言作为一名深耕操作系统和嵌入式开发的工程师我深知资源管理的重要性。在系统开发中合理的资源管理可以提高系统的性能和可靠性。在 Linux 内核中内存管理是一个核心组件它负责管理系统的内存资源。今天我们就来深入探讨 Linux 内核中的内存管理从技术原理到实战应用。技术原理内存管理的核心概念Linux 内核的内存管理主要包括物理内存实际的硬件内存由物理地址空间组成。虚拟内存为每个进程提供的独立地址空间通过页表映射到物理内存。页表存储虚拟地址到物理地址的映射关系。内存分配器负责分配和回收内存如伙伴系统、slab 分配器等。内存回收当内存不足时回收不常用的内存。内存压缩通过压缩内存页来节省内存空间。内存管理的实现原理// 页表项结构体 struct page { unsigned long flags; // 页标志 atomic_t _count; // 页引用计数 atomic_t _mapcount; // 页映射计数 unsigned long private; // 私有数据 struct address_space *mapping; // 地址空间 pgoff_t index; // 页在文件中的偏移 struct list_head lru; // LRU 链表 // ... 其他字段 }; // 内存分配器伙伴系统 static struct page *__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid, nodemask_t *nodemask) { // 实现内存分配逻辑 // ... } // 内存分配器slab 分配器 struct kmem_cache { struct kmem_cache_cpu __percpu *cpu_slab; size_t size; // 对象大小 size_t align; // 对齐要求 unsigned int flags; // 标志 const char *name; // 缓存名称 // ... 其他字段 }; // 虚拟内存区域 struct vm_area_struct { unsigned long vm_start; // 虚拟地址起始 unsigned long vm_end; // 虚拟地址结束 struct vm_area_struct *vm_next, *vm_prev; // 链表指针 pgprot_t vm_page_prot; // 页面保护属性 unsigned long vm_flags; // 标志 struct mm_struct *vm_mm; // 内存描述符 // ... 其他字段 }; // 内存描述符 struct mm_struct { struct vm_area_struct *mmap; // 虚拟内存区域链表 unsigned long mmap_base; // 虚拟内存区域基地址 unsigned long task_size; // 任务大小 pgd_t *pgd; // 页全局目录 atomic_t mm_users; // 用户计数 atomic_t mm_count; // 引用计数 // ... 其他字段 };创业视角分析从创业者的角度来看内存管理的设计思路与企业管理中的资源管理有着密切的联系资源分配内存分配器负责分配和回收内存就像企业中的资源分配部门确保资源的合理使用。虚拟化虚拟内存为每个进程提供独立的地址空间就像企业中的虚拟化技术提高资源的利用率。优先级管理内存回收策略会优先回收不常用的内存就像企业中的优先级管理确保重要任务能够获得足够的资源。性能优化内存管理通过缓存、预分配等机制优化性能就像企业中的流程优化提高资源使用效率。实用技巧内存管理的使用场景内核模块开发使用kmalloc、vmalloc等函数分配内核内存。用户空间编程使用malloc、mmap等函数分配用户空间内存。内存密集型应用如数据库、图像处理等需要合理管理内存使用。实时系统需要确保内存分配的确定性和可预测性。内存管理的最佳实践合理分配内存根据实际需求选择合适的内存分配方式和大小。及时释放内存使用完毕后及时释放内存避免内存泄漏。使用内存池对于频繁分配和释放的小内存块使用内存池提高性能。监控内存使用定期监控系统的内存使用情况及时发现和解决内存问题。优化内存访问减少内存碎片提高内存访问的局部性提升缓存命中率。代码示例内核内存分配#include linux/module.h #include linux/kernel.h #include linux/slab.h #include linux/vmalloc.h // 模块初始化 static int __init memory_example_init(void) { char *kmalloc_ptr; char *vmalloc_ptr; // 使用 kmalloc 分配内存 kmalloc_ptr kmalloc(1024, GFP_KERNEL); if (!kmalloc_ptr) { printk(KERN_ERR kmalloc failed\n); return -ENOMEM; } printk(KERN_INFO kmalloc allocated at %p\n, kmalloc_ptr); // 使用 vmalloc 分配内存 vmalloc_ptr vmalloc(1024 * 1024); // 1MB if (!vmalloc_ptr) { printk(KERN_ERR vmalloc failed\n); kfree(kmalloc_ptr); return -ENOMEM; } printk(KERN_INFO vmalloc allocated at %p\n, vmalloc_ptr); // 使用内存 strcpy(kmalloc_ptr, Hello, kmalloc!); strcpy(vmalloc_ptr, Hello, vmalloc!); printk(KERN_INFO kmalloc content: %s\n, kmalloc_ptr); printk(KERN_INFO vmalloc content: %s\n, vmalloc_ptr); // 释放内存 kfree(kmalloc_ptr); vfree(vmalloc_ptr); printk(KERN_INFO Memory example initialized\n); return 0; } // 模块退出 static void __exit memory_example_exit(void) { printk(KERN_INFO Memory example exited\n); } module_init(memory_example_init); module_exit(memory_example_exit); MODULE_LICENSE(GPL); MODULE_DESCRIPTION(Memory allocation example); MODULE_AUTHOR(Your Name);用户空间内存分配#include stdio.h #include stdlib.h #include string.h #include sys/mman.h int main(void) { char *malloc_ptr; char *mmap_ptr; // 使用 malloc 分配内存 malloc_ptr (char *)malloc(1024); if (!malloc_ptr) { perror(malloc failed); return 1; } printf(malloc allocated at %p\n, malloc_ptr); // 使用 mmap 分配内存 mmap_ptr (char *)mmap(NULL, 1024 * 1024, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (mmap_ptr MAP_FAILED) { perror(mmap failed); free(malloc_ptr); return 1; } printf(mmap allocated at %p\n, mmap_ptr); // 使用内存 strcpy(malloc_ptr, Hello, malloc!); strcpy(mmap_ptr, Hello, mmap!); printf(malloc content: %s\n, malloc_ptr); printf(mmap content: %s\n, mmap_ptr); // 释放内存 free(malloc_ptr); munmap(mmap_ptr, 1024 * 1024); return 0; }内存使用监控# 查看系统内存使用情况 free -h # 查看进程内存使用情况 ps aux --sort-%mem | head -n 10 # 查看内存映射 cat /proc/[pid]/maps # 查看内存统计信息 cat /proc/meminfo # 查看 slab 分配器使用情况 cat /proc/slabinfo # 查看页表信息 cat /proc/[pid]/pagemap总结Linux 内核中的内存管理是一个核心组件它负责管理系统的内存资源。内存管理通过物理内存、虚拟内存、页表、内存分配器等组件实现了内存的高效管理和使用。虚拟内存为每个进程提供了独立的地址空间提高了系统的安全性和可靠性。工作也要流程化内存管理就像是系统中的资源管理工具它确保了内存资源的合理分配和使用。在实际应用中我们需要合理分配内存及时释放内存使用内存池监控内存使用以及优化内存访问以实现系统的最佳性能和可靠性。这就是生机所在通过深入理解和应用内存管理技术我们不仅可以构建更高效、更可靠的系统也可以从中汲取企业管理的智慧为创业之路增添一份技术的力量。

相关文章:

Linux 内核中的内存管理:从物理内存到虚拟内存

Linux 内核中的内存管理:从物理内存到虚拟内存 引言 作为一名深耕操作系统和嵌入式开发的工程师,我深知资源管理的重要性。在系统开发中,合理的资源管理可以提高系统的性能和可靠性。在 Linux 内核中,内存管理是一个核心组件&…...

从硬编码到动态定义:Qlib表达式引擎如何重构量化因子开发范式

从硬编码到动态定义:Qlib表达式引擎如何重构量化因子开发范式 【免费下载链接】qlib Qlib 是一个面向人工智能的量化投资平台,其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值,从探索投资策略到实现产品化部署。该平台支持…...

DeepSeek 服务故障,稳定性挑战待解

3 月 29 日晚至 30 日上午,DeepSeek 网页和 App 连崩 10 多个小时。这已不是其首次出问题,随着可能发布的 DeepSeek - V4,系统稳定性成梁文锋亟待解决的难题。事故回顾3 月 29 日 21:35,DeepSeek 网页/APP 服务异常,23…...

实时手机检测-通用效果对比:YOLOv5s/v8n/DAMOYOLO-S三模型同图评测

实时手机检测-通用效果对比:YOLOv5s/v8n/DAMOYOLO-S三模型同图评测 1. 引言:为什么需要更好的手机检测模型? 想象一下,你正在开发一个智能会议室管理系统,需要自动检测参会者是否在会议期间违规使用手机。或者&#…...

群晖ARPL界面IP显示正常但Synology Assistant搜不到?试试这5个排查步骤

群晖ARPL界面IP显示正常但Synology Assistant搜不到的深度排查指南 当你兴奋地完成黑群晖的ARPL引导安装,在启动界面看到系统已经成功获取IP地址,却突然发现Synology Assistant工具死活搜不到这个IP时,那种从云端跌入谷底的感觉我太熟悉了。这…...

基于西门子S7-1200的换热站PLC与换热器程序,V16及以上博图WinCC画面组态,手自动...

换热站plc程序换热器程序 (22)采用西门子S7-1200博图WinCC画面组态,博图V16及以上版本都可以仿真运行,无需硬件。 系统带有手动/自动模式,运行数据动态实时显示,带温度实时曲线显示,…...

未发表】“VMD-BKA-CNN-BiLSTM四模型多变量时序预测一键对比Matlab代码

【未发表】VMD-BKA-CNN-BiLSTM四模型多变量时序预测一键对比 Matlab代码 可用于风电预测,光伏预测等 基于变分模态分解结合黑翅鸳算法优化卷积神经网络结合双向长短期记忆神经网络的数据多变量时序预测一键对比 各种对比图都有 包含VMD-BKA-CNN-BiLSTM,VMD-CNN…...

COMSOL激光烧蚀激光融覆选区激光融化 激光直接沉积过程中,快速熔化凝固和多组分粉末的加入导...

COMSOL激光烧蚀激光融覆选区激光融化 激光直接沉积过程中,快速熔化凝固和多组分粉末的加入导致了熔池中复杂的输运现象。 热行为对凝固组织和性能有显著影响。 通过三维数值模型来模拟在316L上直接激光沉积过程中的传热、流体流动、凝固过程。 通过瞬态热分布可以获…...

蹲实验室折腾了两天FPGA终于把BISS-C协议编码器的坑填了。这次实现的Verilog方案有点意思,直接上硬货说说实现要点

雷尼绍BISS-C协议编码器verilog源码,支持18/26/32/36bit配置(也可以方便改成其他非标配置),支持最高10M时钟频率,由于是用FPGA纯verilog编写, 1)方便移植部署 2)可以支持多路编码器同时读取 3)成功在板卡跑…...

别再纠结选哪个了!CAN、串口、蓝牙、TCP,手把手教你根据项目场景选通信协议(附Android实战代码)

通信协议选型实战指南:从车载系统到智能家居的黄金法则 当你在凌晨三点的办公室里盯着四块显示器,面前摆着CAN分析仪、蓝牙嗅探器和串口调试终端时,突然意识到项目deadline就在明天——这种场景对嵌入式开发者来说再熟悉不过了。选择错误的通…...

设备维护日历可视化:用低代码平台打造智能保养提醒看板(含模板下载)

设备维护日历可视化:用低代码平台打造智能保养提醒看板 在制造业的日常运营中,设备维护保养常常被视为"必要但繁琐"的后台工作。传统的手工记录或Excel表格管理方式,不仅效率低下,还容易因人为疏忽导致关键保养任务被遗…...

jquery-match-height完全教程:5分钟学会创建完美等高元素

jquery-match-height完全教程:5分钟学会创建完美等高元素 【免费下载链接】jquery-match-height a responsive equal heights plugin 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-match-height jquery-match-height是一款强大的响应式等高元素插件&…...

Bypass Paywalls Clean 3大突破策略:2024浏览器扩展技术指南

Bypass Paywalls Clean 3大突破策略:2024浏览器扩展技术指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 当你在撰写行业分析报告时,是否曾因关键数据被付费…...

探索ImageGlass:一个轻量级图像浏览器的多格式支持解决方案

探索ImageGlass:一个轻量级图像浏览器的多格式支持解决方案 【免费下载链接】ImageGlass 🏞 A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 当你面对数十种不同格式的图像文件时,是…...

MuJoCo仿真实战:用aubo-i5机器人模型搭建你的第一个物理仿真环境(Windows/Linux双平台)

MuJoCo仿真实战:用aubo-i5机器人模型搭建你的第一个物理仿真环境(Windows/Linux双平台) 机器人仿真技术正在重塑工业自动化研发流程。想象一下,在投入数百万购置实体设备前,你就能在虚拟环境中验证算法、优化轨迹规划、…...

终极SQLite命令行工具litecli:10个必备功能完全指南

终极SQLite命令行工具litecli:10个必备功能完全指南 【免费下载链接】litecli CLI for SQLite Databases with auto-completion and syntax highlighting 项目地址: https://gitcode.com/gh_mirrors/li/litecli 如果你正在寻找一个功能强大、简单易用的SQLit…...

UniApp应用变现实战:用uni-ad激励视频提升用户留存与收益的配置心得

UniApp应用变现实战:用uni-ad激励视频提升用户留存与收益的配置心得 在移动应用生态中,广告变现与用户体验的平衡一直是开发者面临的难题。激励视频作为一种用户主动参与的广告形式,不仅能为开发者带来收益,还能通过奖励机制提升用…...

I3C协议学习总结

I3C可以使用推挽式,节省功耗,速度更快SDR 单数据传输速率, SCL时钟频率可达到12.5MHz所有符合I3C标准的设备都必须要拥有一个总线特性寄存器1. I3C 协议模式概览 (Section 5)文档首先列出了 I3C 支持的几种主要通信模式:SDR (Sing…...

手把手教你用QGIS加载并可视化2025年北京OSM路网SHP数据(WGS84坐标系)

零基础实战:QGIS加载OSM路网数据的完整可视化流程 第一次打开QGIS时,面对满屏的工具栏和菜单选项,很多初学者都会感到无从下手。特别是当手头有一份刚下载的SHP格式路网数据时,如何正确加载、设置坐标系并进行基础可视化&#xff…...

避开这3个坑!STM32 CubeMX配置QSPI读写MX25L25645G实战复盘

STM32 CubeMX配置QSPI驱动MX25L25645G的三大实战陷阱与解决方案 在嵌入式系统开发中,外部Flash存储器的使用几乎成为标配,而MX25L25645G凭借其256Mb的大容量和QSPI接口的高速特性,成为许多STM32项目的首选。但当你真正开始用CubeMX配置QSPI接…...

Packet Tracer实战:交换机基础配置与常见问题排查

1. Packet Tracer与交换机配置入门 第一次接触网络设备配置的朋友可能会觉得交换机是个神秘的黑盒子。其实用Cisco Packet Tracer这个仿真工具,你完全可以在自己的电脑上搭建一个虚拟实验室。我刚开始学习时也是从这个工具入手的,它比真机操作更友好——…...

Origin绘图进阶:如何在现有图形上叠加散点图与等高线(附完整操作步骤)

Origin高级绘图技巧:散点图与等高线的完美叠加实战指南 科研数据可视化中,单一图表往往难以全面展示复杂数据关系。当您需要在同一坐标系中同时呈现离散数据点与连续趋势时,散点图与等高线的组合堪称黄金搭档。这种混合图表特别适合展现发动机…...

原创:黄大年茶思屋难题揭榜第11期|5道核心题精简公开·被退稿求技术指正

黄大年茶思屋难题揭榜第11期|5道核心题精简公开被退稿求技术指正 作者:华夏之光永存 摘要 这五道题我们已完整解题并提交黄大年茶思屋难题揭榜,最终被直接退稿,但平台未给出任何具体技术驳回理由、未指明缺陷、未提供修改方向。我…...

Harness Engineering 又是什么新 AI 玩具?

今天我们聊了业内最新提出的 Harness Engineering。可以看到,在 AI 智能体优先的世界里,软件工程的鲁棒性开始转移到了支撑智能体上。最近 AI 编程可以说是卷上天了,不得不说时代的大车轱辘已经碾过来了。GLM 一个月内狂发新模型。我们今天来…...

MissionPlanner地面站调试Pixhawk:除了基础校准,你的F450还能设置这些高级功能

MissionPlanner地面站进阶指南:解锁Pixhawk飞控的隐藏潜力 当你已经能够熟练完成F450无人机的基础校准,让四轴稳稳升空只是起点而非终点。MissionPlanner作为Pixhawk飞控的瑞士军刀,藏着许多被普通教程忽略的进阶功能——这些功能往往决定着你…...

MiniCPM-o-4.5-nvidia-FlagOS处理Markdown文档效果:使用Typora风格进行优雅排版

MiniCPM-o-4.5-nvidia-FlagOS处理Markdown文档效果:使用Typora风格进行优雅排版 不知道你有没有过这样的经历:辛辛苦苦写了一大堆技术笔记,代码片段、命令、思路混杂在一起,过几天自己再看,都感觉像在看天书。或者&…...

ISL29125 RGB环境光传感器驱动与嵌入式应用实战

1. ISL29125 RGB环境光传感器技术解析与嵌入式驱动开发实践ISL29125 是 Intersil(现属 Renesas)推出的一款高精度、低功耗、IC 接口的 RGB 环境光传感器(Ambient Light Sensor, ALS),专为智能手机、平板电脑、可穿戴设…...

解决MicroBlaze程序启动难题:Vivado中bit与elf文件合并的完整流程

解决MicroBlaze程序启动难题:Vivado中bit与elf文件合并的完整流程 在FPGA开发中,MicroBlaze软核处理器的应用越来越广泛,但许多开发者都会遇到一个共同的痛点:每次下载程序都需要分别加载bit文件和elf文件,这不仅增加了…...

如何用React打造经典Windows XP桌面体验:完整实现指南

如何用React打造经典Windows XP桌面体验:完整实现指南 【免费下载链接】winXP 🏁 Web based Windows XP desktop recreation. 项目地址: https://gitcode.com/gh_mirrors/wi/winXP Windows XP作为微软最经典的操作系统之一,至今仍被许…...

告别繁琐安装!3分钟用PPTist打造专业级在线演示文稿

告别繁琐安装!3分钟用PPTist打造专业级在线演示文稿 【免费下载链接】PPTist 基于 Vue3.x TypeScript 的在线演示文稿(幻灯片)应用,还原了大部分 Office PowerPoint 常用功能,实现在线PPT的编辑、演示。支持导出PPT文…...