商道如狼道 发表于 5 天前

驱动开辟学习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()体系调用时,按需回写

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 驱动开辟学习20250520