驱动开发学习20250520

写时复制(CoW)

  • 目的:进行数据修改操作时,不是马上复制整个数据对象,而是要等到真正需要修改数据的那个时刻才执行复制操作。
  • PTE(页表项)被添加到进程页面表中,并被标记为不可写入
  • 该映射导致在进程VMA(虚拟内存列表)列表中创建VMA。页面被添加到该VMA,并将该VMA标记为可写入
  • 在页面访问时,故障处理程序注意到差异,这就是写时复制。然后将分配物理页面,该页面被指定给上面添加的PTE,更新PTE标志,刷新TLB项,执行do_wp_page()函数,该函数可以将共享地址中的内容复制到新位置

使用I/O内存访问硬件

  • 端口输入输出(PIO):寄存器可通过专用总线访问(端口地址空间共65536个)
  • 内存映射输入输出(MMIO):设备的寄存器映射到内存,读取或写入特定地址即可写入设备的寄存器。

内存映射

kmap():用于将指定的页面映射到内核地址空间

void *kmap(struct page *page);

page指针指向要映射的struct page。当分配高端内存页时不能直接寻址,必须调用kmap()函数将高端内存暂时映射到内核地址空间(在不需要该内存时应立即撤销)。该映射持续到调用kunmap()位置

void kunmap(struct page *page);

Linux缓存系统

缓存:将经常访问或新写入的数据从称作缓存的更快的小存储器提取或写入其中的过程

脏内存:缓存的内容被修改后尚未写回磁盘

缓存策略的优点:

  • 减少数据访问延迟,从而提高应用程序性能
  • 延长存储寿命
  • 减少系统负载
  • 减少数据丢失风险

缓存算法策略:

  • 直写式缓存:所有写操作会自动更新内存缓存和永久存储器
  • 绕写式缓存:立即使缓存失效,所有后续数据读取都只能从磁盘获取数据
  • 回写式缓存:当发生更改时将数据写入缓存,先不更新主存储其中的相应位置。页面缓存中对应的页面标记为脏,并将其添加到由内核维护的列表中,数据只有在指定的时间间隔或某个条件下才写入永久存储器的相应位置。当页面中的数据与页面缓存中的数据一致时,内核会从该列表中移除页面,不再把它们标记为脏
    刷新线程(脏页回写)条件:
  • 当空闲内存低于指定阈值时,重新获得脏页所消耗的内存
  • 脏数据持续到指定的时间段时,最旧的数据被写回磁盘,确保脏数据不会无限期的保持脏状态
  • 当用户进程调用sync()和fsync()系统调用时,按需回写
相关推荐
mmoyula8 小时前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发
站在巨人肩膀上的码农1 天前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
车载操作系统---攻城狮1 天前
[驱动开发篇] Can通信快速入门手册 - 应用篇
驱动开发
Natsume17103 天前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
S,D4 天前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
Despacito0o4 天前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
小米里的大麦14 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
Svan.15 天前
Portable Watch:基于STM32的便携智能手表
arm开发·驱动开发·stm32·嵌入式硬件·硬件工程·pcb工艺·智能手表
楼台的春风17 天前
【Linux驱动开发 ---- 4_驱动开发框架和 API】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu
楼台的春风17 天前
【Linux驱动开发 ---- 1.1_Linux 基础操作入门】
linux·c语言·c++·人工智能·驱动开发·嵌入式硬件·ubuntu