- 論壇徽章:
- 0
|
看了一下代碼,發(fā)現(xiàn)還真可以存在兩個(gè)一樣的buffer_head(dev,block)
映射設(shè)備操作
v2.4.32
文件/dev/sda1
1.打開(kāi)設(shè)備
fp=fopen("/dev/sda1","r");
sys_open->...->ext2_read_inode->init_special_inode->
inode->i_fop = &def_blk_fops;
該結(jié)構(gòu)為(block_dev.c中)
struct file_operations def_blk_fops = {
open: blkdev_open,
release: blkdev_close,
llseek: block_llseek,
read: generic_file_read,
write: generic_file_write,
mmap: generic_file_mmap,
fsync: block_fsync,
ioctl: blkdev_ioctl,
};
sys_open->....->blkdev_open->bd_acquire->bdget
inode->i_data.a_ops = &def_blk_aops;
該結(jié)構(gòu)為
struct address_space_operations def_blk_aops = {
readpage: blkdev_readpage,
writepage: blkdev_writepage,
sync_page: block_sync_page,
prepare_write: blkdev_prepare_write,
commit_write: blkdev_commit_write,
direct_IO: blkdev_direct_IO,
};
->bd_acquire
inode->i_mapping = bdev->bd_inode->i_mapping;
2.映射設(shè)備
mmap(fp,....)
sys_mmap2->....->generic_file_mmap
vma->vm_ops = &generic_file_vm_ops;
結(jié)構(gòu)為
static struct vm_operations_struct generic_file_vm_ops = {
nopage: filemap_nopage,
};
3.對(duì)該內(nèi)存塊,發(fā)生缺頁(yè)中斷
do_page_fault->handle_mm_fault->handle_pte_fault->do_no_page
new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
調(diào)用filemap_nopage->page_cache_read
int error = mapping->a_ops->readpage(file, page);
調(diào)用blkdev_readpage->block_read_full_page->submit_bh
這樣一來(lái),就有可能存在一個(gè)塊的兩份拷貝了,從而可能導(dǎo)致混亂
謝謝zx_wing的幫助 |
|