内存映射linux内核中的设备文件

时间:2014-03-08 18:32:50

标签: memory-management linux-kernel

在linux内核中,当我做

cat / proc / pid / maps

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

1 个答案:

答案 0 :(得分:0)

我认为这是正确的:当设备映射特定的内存区域时,例如X到Y,vm_area_structvm_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_operations_struct实施了vm_area_struct。如果是,它将调用" fault"会员功能。看一下该函数的一些实现。

此函数的实现应返回指向页面结构的指针。页面本身将由设备驱动程序分配并填充数据(即" fault"功能)。

页面处理程序的其余部分会将pte条目与该页面相关联。这意味着下次访问页面并导致页面错误时,第3646行上的检查pte_none将失败。这将导致第二次引用特定页面时跳过设备驱动程序故障功能。

注意:vm_area_struct可以映射到多个页面结构。因此,一个vm_area_struct可能适合N * 4KB。假设PAGE_SIZE为4KB且N = 1,2,...,X