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

Linux 驱动内存子系统核心知识精要(纯干货版)

Linux 驱动内存子系统核心知识精要(纯干货版)

一、 内存分配策略标志:GFP_KERNEL vs GFP_ATOMIC

核心区别:是否允许睡眠(Can Block)。

标志行为使用场景内存来源
GFP_KERNEL允许睡眠。分配器会主动回收内存或交换页,进程阻塞直到分配成功。进程上下文proberead/writeioctl、工作队列(workqueue)。常规内存池 + Swap 交换区。
GFP_ATOMIC绝不睡眠。若内存不足,立即返回NULL原子上下文:中断顶/底半部(Tasklet)、自旋锁临界区、定时器回调。系统预留的紧急内存池(Emergency Pool),容量极小。

致命错误:在持有自旋锁或中断上下文中使用GFP_KERNEL,会触发BUG: scheduling while atomic,导致内核 Panic。


二、 内存分配函数:kmalloc vs vmalloc

核心区别:物理内存的连续性及虚拟地址映射方式(依赖 MMU)。

特性kmalloc (kzalloc)vmalloc
物理地址连续(伙伴系统分配)。不连续(离散物理页框拼接)。
虚拟地址直接映射区(线性偏移),转换快。动态映射区(非线性),需更新多级页表,TLB 命中率低,开销大。
最大分配量较小(受限于伙伴系统,单次通常 < 4MB)。较大(可达数百 MB)。
硬件 DMA适合(外设需要物理连续地址)。不适合(物理地址分散,DMA 无法寻址)。

实战原则:自定义结构体(如ds18b20)用kzalloc;加载大模块或帧缓冲(Framebuffer)用vmalloc


三、 硬件基石:MMU(内存管理单元)

核心使命:将程序使用的虚拟地址(VA)实时翻译为物理内存条的物理地址(PA)

  1. 页表翻译:以 4KB 为页粒度查找页表。若页表无映射,触发Unable to handle kernel paging request崩溃。
  2. 权限隔离(Ring 0 / Ring 3):页表中包含 R/W 和 User/Supervisor 权限位。用户态访问内核空间地址,MMU 直接触发权限异常。
  3. TLB 与 Cache 一致性陷阱
    • 现象:CPU 从 Cache 取旧数据,而 DMA 外设已更新物理内存。
    • 对策:操作 DMA 缓冲区前后必须调用dma_map_singledma_sync_single_for_cpu刷新 Cache/MMU 缓存。

四、 权限隔离:内核空间 vs 用户空间

CPU 特权级:内核空间(Ring 0,执行所有指令) vs 用户空间(Ring 3,禁止特权指令)。

地址视野(32位系统示例)

  • 用户空间0x0000 0000 ~ 0xC000 0000(3GB),每个进程独立
  • 内核空间0xC000 0000 ~ 0xFFFFFFFF(1GB),所有进程共享

数据交互绝对法则(摆渡函数)
驱动禁止直接memcpy用户态指针,必须使用专用 API:

  • copy_from_user(void *to, const void __user *from, unsigned long n)
  • copy_to_user(void __user *to, const void *from, unsigned long n)

中断上下文禁令copy_from_user内部可能因缺页异常而睡眠(等待磁盘 IO),绝不允许在中断上下文调用


五、 零拷贝进阶:mmap 内存映射

核心机制:在用户态虚拟地址和内核态物理内存之间建立直接映射,零拷贝(Zero-Copy),适合传输 >4KB 的大数据。

驱动侧实现模板

staticintmy_mmap(structfile*filp,structvm_area_struct*vma){// 1. 获取物理页框号(PFN)unsignedlongpfn=virt_to_phys(ds18b20->buffer)>>PAGE_SHIFT;// 2. 设置 Cache 属性(必须明确指定)vma->vm_page_prot=pgprot_noncached(vma->vm_page_prot);// 3. 核心映射 API(修改 MMU 页表)if(remap_pfn_range(vma,vma->vm_start,pfn,vma->vm_end-vma->vm_start,vma->vm_page_prot)){return-EAGAIN;}return0;}

Cache 属性抉择(面试高频)

  • pgprot_noncached:直达物理内存。适合硬件寄存器、DMA 共享内存(保证实时一致性,速度最慢)。
  • pgprot_writecombine:读直达,写合并。适合 Framebuffer 显存
  • 默认(缓存):适合纯软件数据传输。

copy_from_user的对决

维度copy_from_usermmap
拷贝次数2 次(硬件→内核→用户)0 次
适用数据量< 1KB(控制指令、配置参数)> 4KB(视频流、大量采样数据)
风险等级低(内核全程校验)高(用户直接操作物理内存)

mmap 两大致命陷阱

  1. 越界映射:APP 传入的len大于驱动实际分配的内存,remap_pfn_range会映射到非法物理内存。解法:检查vma->vm_end - vma->vm_start,超出返回-EINVAL
  2. 释放后访问(Use-After-Free):驱动removekfree了内存,但 APP 未调用munmap。APP 再次读写时触发Unable to handle kernel paging request解法:在驱动的release函数中遍历 VMA 强制解除映射(zap_vma_ptes)。

http://www.jsqmd.com/news/1327318/

相关文章:

  • OBS多路RTMP推流插件:一键实现多平台直播同步的终极解决方案
  • 2026年纸皮核桃加工厂家挑选攻略 国内靠谱企业实测盘点 - 比奇堡111
  • 车载Audio子系统开发实战:从ALSA驱动到设备树配置全解析
  • 2026 福州马尾区家电故障自检手册:马尾镇这些小毛病自己能先查 - 观金堂
  • GGSLB全局负载均衡策略详解
  • 2026锦州买华为手机选哪家?三家合规授权门店综合实力** - 产品推荐官
  • MQTT Broker存在的必要性
  • AI辅助英语阅读的黄金4.7秒法则(神经语言学验证+眼动追踪实验首发)
  • 【计算机毕业设计】基于大模型的游戏交易系统的设计与实现
  • 10人如何借助一台高配置工作站进行SolidWorks高效设计?
  • 2026年辽阳厨师考试机构 满足多元考证需求 推荐合规靠谱选项 - 滚动商讯
  • AI生成3D模型后怎么自动生成贴图?用V2Fun从基础纹理到可用材质
  • 2026 广州钻石回收哪家靠谱?易奢福到店核验当面估价 - 奢侈品回收实体店探店
  • 终极指南:Universal-Updater让3DS自制软件管理变得像玩游戏一样简单
  • 学术会议投稿与参会全流程详解:从选会到检索的完整指南 - RDLink研发家
  • 每日论文解读(8.3)2——AgentHPOBench:面向序列超参数优化的LLM Agent评估基准
  • 揭秘Transformer推理功耗黑洞:5个被99%团队忽略的能效优化关键节点
  • 2024Q2最新数据:已部署AI新质生产力的企业订单交付周期缩短41%,你还在用旧范式决策?
  • 一文读懂档案袋怎么密封?避开90%人踩中的档案失效误区 - 资讯报道
  • 5个选项搞定工业以太网交换机选型
  • 抢抓团餐产业升级新机遇,仙津饮品依托核心产品力拓展农产品渠道饮料合作空间,助力团餐食材供应多元化 - U渠道
  • 2026燕郊全屋定制工厂** 两大主流源头工厂实力对比 - 资讯综合
  • 阜阳企业布局豆包流量:读懂豆包排名优化与GEO优化落地思路
  • 5分钟快速搭建原神私服:KCN-GenshinServer图形化一键服务端终极指南
  • 极简高端工装风!仿石材铝单板适配各类公装项目
  • 深度解析:如何用OBS背景移除插件打造专业级虚拟演播室
  • 高效解锁喜马拉雅音频资源的5个实用技巧:xmly-downloader-qt5完全指南
  • 乾元通多链路聚合设备,无人机的超远距离图传网络保障方案
  • Depth-Anything-V2:从单目图像到三维世界的深度感知革命
  • **作为一个后端,我不想再接第 50 个“帮我导个文档“的需求了**