- 论坛徽章:
- 0
|
看了一下代码,发现还真可以存在两个一样的buffer_head(dev,block)
映射设备操作
v2.4.32
文件/dev/sda1
1.打开设备
fp=fopen("/dev/sda1","r");
sys_open->...->ext2_read_inode->init_special_inode->
inode->i_fop = &def_blk_fops;
该结构为(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;
该结构为
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.映射设备
mmap(fp,....)
sys_mmap2->....->generic_file_mmap
vma->vm_ops = &generic_file_vm_ops;
结构为
static struct vm_operations_struct generic_file_vm_ops = {
nopage: filemap_nopage,
};
3.对该内存块,发生缺页中断
do_page_fault->handle_mm_fault->handle_pte_fault->do_no_page
new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
调用filemap_nopage->page_cache_read
int error = mapping->a_ops->readpage(file, page);
调用blkdev_readpage->block_read_full_page->submit_bh
这样一来,就有可能存在一个块的两份拷贝了,从而可能导致混乱
谢谢zx_wing的帮助 |
|