- 论坛徽章:
- 11
|
本帖最后由 zylthinking 于 2012-02-14 16:38 编辑
看代码是发现 MAP_SHARED, -1 这个组合的实现和 MAP_PRIVATE, -1 这个组合不同, 但我相不明白到底为什么有这个不同。
我查看了 2.6 的代码, 发现和我所看的 2.4 代码大体一致, 帖个 2.4 的上来:
if ((vma->vm_flags & (VM_SHARED | VM_WRITE)) == VM_WRITE &&
!(flags & MAP_NORESERVE) &&
!vm_enough_memory(len >> PAGE_SHIFT))
goto free_vma;
if (file) {
if (vma->vm_flags & VM_DENYWRITE) {
error = deny_write_access(file);
if (error)
goto free_vma;
correct_wcount = 1;
}
vma->vm_file = file;
get_file(file);
error = file->f_op->mmap(file, vma);
if (error)
goto unmap_and_free_vma;
} else if (flags & MAP_SHARED) {
error = shmem_zero_setup(vma);
if (error)
goto free_vma;
}
int shmem_zero_setup(struct vm_area_struct *vma)
{
struct file *file;
loff_t size = vma->vm_end - vma->vm_start;
file = shmem_file_setup("dev/zero", size);
if (IS_ERR(file))
return PTR_ERR(file);
if (vma->vm_file)
fput (vma->vm_file);
vma->vm_file = file;
vma->vm_ops = &shmem_shared_vm_ops;
return 0;
}
按照实现, 我尝试使用 shm_open 去尝试打开 dev/zero, 发觉不行, 仔细想想, 原来是 dev/zero 保证了内核会去找 dev 目录下的 zero 文件, 而不是名称为 dev/zero 的文件
因此, 到现在还在疑惑我, 内核这么实现, 到底是想为什么操作提供便利
还有几个小问题还没来得及想:
1。 shmem_zero_setup 创建的 file 何时释放
2。 为何 path_walk 能够忽略这些(很可能多余一个, 因为每个 mmap 都可能会创建一个新的) dev/zero 为名称的文件
有了解者, 请不吝赐教 |
|