深入探究文件系统框架与I/O操作
1. 块I/O与vnode页面
块I/O子系统支持对vnode页面进行I/O操作。以下三个函数可用于在物理页面和设备之间发起I/O:
| 函数 | 描述 |
| — | — |
| bdev_strategy() | 使用块I/O设备在页面上发起I/O |
| pageio_done() | 等待块设备I/O完成 |
| pageio_setup() | 为内存页面的I/O设置块缓冲区,通过设置B_PAGEIO标志并将页面列表放在b_pages字段,绕过块缓冲区缓存 |
另外,还有一些与vnode分页相关的函数:
-pvn_write_kluster():在提供的偏移量和长度范围内查找连续的脏页,返回准备写回的脏锁定页面列表。调用该函数返回后,调用者通常使用pageio_setup为返回的偏移量和长度设置写操作,然后使用bdev_strategy()发起写操作。如果是同步写,调用者应调用pvn_write_done()解锁页面;如果是异步写,io_done例程在写操作完成时调用pvn_write_done。
-pvn_vplist_dirty():查找页面缓存中偏移量大于提供的偏移量的所有脏页,并调用提供的putapage()例程。当vop_putpage以零长度调用时,该函数常用于同步vnode