page fault 过程
来源:互联网 发布:myeclipse新建java项目 编辑:程序博客网 时间:2024/05/29 18:08
ext2文件读(写)过程:结构图(P561) 理解每一层的做什么
read(P508) 【层:User Mode】
-->sys_read-->vfs_read-->file->f_op->read() 【层:VFS】
---->generic_file_read(P632) 【层:Disk File(Block Device File)】
------>do_generic_file_read(p635)-->do_generic_mapping_read 【层:Page Cache (inode)】
-------->ext2_read_page(P638)-->mpage_readpage() 【层:ext2】
---------->submit_bio()-->generic_make_request(P570) 【层:Generic Block Layer】
------------>__make_request -->q->add_request() 【层:I/O Scheduler】
相关request在I/O Scheduler队列中的 q->request_fn函数(即do_hd_request)调用:
do_hd_request(以HD.c为例) 【层:Block Device Driver 取队列,发起读请求】
-->elv_next_request(),
-->hd_request()
read_intr() 【层:Block Device Driver中断,读数据,从队列中删除,再发起请求】
-->end_request()
---->end_that_request_first()
---->blkdev_dequeue_request()
---->end_that_request_last()
共享内存(P801)、文件映射(P657)、直接文件读写的区别
a. 共享内存的缺页:
do_no_page (预先在mmap()-->shmem_zero_setup设置shmem_nopage )
-->vma->vm_ops->nopage
-->shmem_nopage
---->shmem_getpage
------>find_lock_page
------>shmem_alloc_page
------>add_to_page_cache_lru
b. 文件映射的缺页:
do_no_page(预先在mmap-->file->f_op->mmap设置filemap_nopage)
-->vma->vm_ops->nopage
-->filemap_nopage
---->find_get_page
---->mapping->a_ops->readpage(一般为ext2_aops.read)
---->ext2_readpage 函数直接读写 ext2文件系统,inode缓存由前面的步骤建立了。
c. 文件映射和直接读写文件相同点:
i. 都调用ext2_readpage函数,则ext2层以下完全相同
ii. 都采用inode的Page Cache,由直接文件读写的do_generic_file_read和文件映射的filemap_nopage分别建立
iii. 都可能尝试磁盘的预读。
d. 文件映射和直接文件读写不同点:
直接读文件,修改后并写入文件:数据需要从内核态-->用户态复制一次,再从用户态-->内核态复制一次,还可能需要两次高端映射。
read(P508) 【层:User Mode】
-->sys_read-->vfs_read-->file->f_op->read() 【层:VFS】
---->generic_file_read(P632) 【层:Disk File(Block Device File)】
------>do_generic_file_read(p635)-->do_generic_mapping_read 【层:Page Cache (inode)】
-------->ext2_read_page(P638)-->mpage_readpage() 【层:ext2】
---------->submit_bio()-->generic_make_request(P570) 【层:Generic Block Layer】
------------>__make_request -->q->add_request() 【层:I/O Scheduler】
相关request在I/O Scheduler队列中的 q->request_fn函数(即do_hd_request)调用:
do_hd_request(以HD.c为例) 【层:Block Device Driver 取队列,发起读请求】
-->elv_next_request(),
-->hd_request()
read_intr() 【层:Block Device Driver中断,读数据,从队列中删除,再发起请求】
-->end_request()
---->end_that_request_first()
---->blkdev_dequeue_request()
---->end_that_request_last()
共享内存(P801)、文件映射(P657)、直接文件读写的区别
a. 共享内存的缺页:
do_no_page (预先在mmap()-->shmem_zero_setup设置shmem_nopage )
-->vma->vm_ops->nopage
-->shmem_nopage
---->shmem_getpage
------>find_lock_page
------>shmem_alloc_page
------>add_to_page_cache_lru
b. 文件映射的缺页:
do_no_page(预先在mmap-->file->f_op->mmap设置filemap_nopage)
-->vma->vm_ops->nopage
-->filemap_nopage
---->find_get_page
---->mapping->a_ops->readpage(一般为ext2_aops.read)
---->ext2_readpage 函数直接读写 ext2文件系统,inode缓存由前面的步骤建立了。
c. 文件映射和直接读写文件相同点:
i. 都调用ext2_readpage函数,则ext2层以下完全相同
ii. 都采用inode的Page Cache,由直接文件读写的do_generic_file_read和文件映射的filemap_nopage分别建立
iii. 都可能尝试磁盘的预读。
d. 文件映射和直接文件读写不同点:
直接读文件,修改后并写入文件:数据需要从内核态-->用户态复制一次,再从用户态-->内核态复制一次,还可能需要两次高端映射。
- page fault 过程
- Linux的page fault
- Unhandled Page fault
- page fault handler
- 内核中的page fault & copy_from_user
- 进程地址空间 - page fault处理
- linux 操作系统的page fault处理
- 追踪Android内核运行时page fault
- EXCEL caused an invalid page fault in
- 关于Page Fault的一些整理
- page fault带来的性能问题
- VMProcessPageFault Error: Page fault occurred while in power handler
- Mac file system kernel trap(page fault)
- MSIMN caused an Invalid Page Fault in module kerne
- JOS 用户态page fault保护处理机制分析
- windows10更新蓝屏 错误代码:page fault in nonpaged area
- Fault
- VMProcessPageFault Error: Page fault occurred while in power handler! Address = 0x40314228解決方法
- 织梦系统使用总结
- TCP和UDP网络通讯的区别及实现方式
- ajax中的xml传送乱码问题
- hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈)
- HTTP协议之缓存
- page fault 过程
- springside4
- svn 命令
- openSUSE12.2-x86_64初体验
- CPoint,CSize,CRect类说明
- OpenASURF的readme翻译
- Linux 下网络编程错误及处理
- linux学习笔记 01_ 目录结构
- BS操作系统