【问题标题】:memory map a device file in linux kernel内存映射Linux内核中的设备文件
【发布时间】:2014-03-08 18:32:50
【问题描述】:

在 linux 内核中,当我这样做时

cat /proc/pid/maps

我得到了一些映射 /dev/XXX 中文件的条目。我知道这是设备文件,它对应于硬件设备而不是实际文件。 linux内核中的内存管理如何处理这种映射?如果我读取或写入 /dev/XXX 会发生什么?

【问题讨论】:

    标签: memory-management linux-kernel


    【解决方案1】:

    我认为这是正确的:当设备映射特定内存区域时,例如 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

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 2015-10-05
      • 2017-11-18
      • 2021-09-05
      • 2013-09-02
      相关资源
      最近更新 更多