2013年(22)
分类: LINUX
2013-08-04 18:37:24
Q:对文件mmap()后,执行ftruncate()将文件的长度置为0,再向映射后的地址写数据会怎么样?
A:收到SIGBUS信号
如果mmap()的page对应的磁盘数据块都是连续的,那么page无需转化为buffer page,可以整页读出page.
缺页异常读入page过程:
do_page_fault()
handle_mm_fault()
handle_pte_fault()
do_linear_fault()
__do_fault()
filemap_fault()
page_cache_read()
page = page_cache_alloc_cold(mapping);
add_to_page_cache_lru()
ext2_readpage()
mpage_readpage()
do_mpage_readpage()
如果page对应的磁盘数据块都是连续的
bio_add_page()整页读取
否则将page转化为buffer page,按块逐个读
mpage_bio_submit()
wait_on_page_locked()
如果mmap()的page对应的磁盘数据块都是连续的,可以把page加入到BIO中整页回写.
脏页回写的过程:
sync_inode()
__writeback_single_inode()
__sync_single_inode()
do_writepages()
ext2_writepages()
mpage_writepages()
write_cache_pages()
__mpage_writepage()
bio_add_page()
mpage_bio_submit(WRITE, mpd.bio);