- 论坛徽章:
- 0
|
最后过程是CPU使用读写I/O端口的指令完成读取过程
文件的读取不是靠CPU的读I/O端口指令完成的,建议LZ看看UKL块设备部分的内容
以下是2.6.11内核读文件的部分代码,进程阻塞由wait_on_page_locked()完成
//////////////////////////////////////读文件//////////////////////////////////////////////
sys_read()->2.6.11
----------------------------VFS层工作---------------------------------------
vfs_read()->
file->f_op->read()->
----------------------------磁盘文件系统和Page cache工作-------------------------------------------------
generic_file_read()->//sys_readv()系统调用同样调用这个函数
__generic_file_aio_read()->
do_generic_file_read()->//完成一个区域的读操作
for(每页)//每次迭代完成读一页数据
调用find_get_page()//从页高速缓存中寻找,如果找到继续读下一页
否则page_cache_alloc_cold()
add_to_page_cache_lru()//将页加入缓存
mapping->a_ops->readpage(filp, page)
ext3_readpage()->//调用具体文件系统读取一页数据的方法
...
//阻塞进程直到page的PG_locked标志清空,此处即使读进程被阻塞的代码
if (!PageUptodate(page)) {
wait_on_page_locked(page)
将页面中的内容拷贝的用户空间(此过程可能发生缺页异常),继续读下一页 |
|