【发布时间】:2014-03-08 18:32:50
【问题描述】:
在 linux 内核中,当我这样做时
cat /proc/pid/maps
我得到了一些映射 /dev/XXX 中文件的条目。我知道这是设备文件,它对应于硬件设备而不是实际文件。 linux内核中的内存管理如何处理这种映射?如果我读取或写入 /dev/XXX 会发生什么?
【问题讨论】:
标签: memory-management linux-kernel
在 linux 内核中,当我这样做时
cat /proc/pid/maps
我得到了一些映射 /dev/XXX 中文件的条目。我知道这是设备文件,它对应于硬件设备而不是实际文件。 linux内核中的内存管理如何处理这种映射?如果我读取或写入 /dev/XXX 会发生什么?
【问题讨论】:
标签: memory-management linux-kernel
我认为这是正确的:当设备映射特定内存区域时,例如 X 到 Y,vm_area_struct(vm_start = X 和 vm_end = Y)与该区域相关联,然后映射进入进程的虚拟内存映射。然后vm_are_struct 与设备驱动程序提供的vm_operations_struct 相关联。
这意味着设备驱动程序将实现vm_operations_struct 中的部分或全部功能。最重要的是fault 函数。
现在,假设进程第一次引用该区域中的页面。这将触发页面错误处理程序。页面错误中有这段代码:
3646 if (pte_none(entry)) {
3647 if (vma->vm_ops) {
3648 if (likely(vma->vm_ops->fault))
3649 return do_linear_fault(mm, vma, address,
3650 pte, pmd, flags, entry);
3651 }
3652 return do_anonymous_page(mm, vma, address,
3653 pte, pmd, flags);
3654 }
注意线 #3648。它检查是否为该vm_area_struct 实现了vm_operations_struct。如果是,它将调用“fault”成员函数。查看该函数的一些实现。
这个函数的实现应该返回一个指向页面结构的指针。页面本身将由设备驱动程序分配和填充数据(即“fault”函数)。
页面处理程序的其余部分会将 pte 条目与该页面相关联。这意味着下次访问该页面并导致页面错误时,第 3646 行的检查 pte_none 将失败。这将导致在第二次引用该特定页面时跳过设备驱动程序故障函数。
注意:vm_area_struct 可以映射到多个页面结构。因此,一个vm_area_struct 可能适合 N*4KB。假设PAGE_SIZE 为 4KB 且 N=1,2,...,X
【讨论】: