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

Memory management linux内核中的设备文件内存映射,memory-management,linux-kernel,Memory Management,Linux Kernel,在linux内核中,当我 cat/proc/pid/maps 我得到了一些映射/dev/XXX中文件的条目。我知道这是设备文件,它对应于硬件设备,而不是实际的文件。linux内核中的内存管理如何处理这种映射?如果我读或写/dev/XXX会发生什么?我认为这是正确的:当一个设备映射一个特定的内存区域时,比如X到Y,一个vm\u区域结构(vm\u start=X和vm\u end=Y)与该区域相关联,然后映射到进程的虚拟内存映射中。然后,该vm_are_struct与设备驱动程序提供的vm_oper

在linux内核中,当我

cat/proc/pid/maps


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

我认为这是正确的:当一个设备映射一个特定的内存区域时,比如X到Y,一个
vm\u区域结构(
vm\u start
=X和
vm\u end
=Y)与该区域相关联,然后映射到进程的虚拟内存映射中。然后,该
vm_are_struct
与设备驱动程序提供的
vm_operations_struct
相关联

这意味着设备驱动程序将实现
vm\u operations\u结构中的部分或全部功能。最重要的是
故障
功能

现在,假设流程第一次引用该区域中的页面。这将触发页面错误处理程序。页面错误包含以下代码:

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\u区域结构
实现了
vm\u操作结构。如果是,它将调用“
fault
”成员函数。看看该函数的一些实现

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

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

注意:
vm\u area\u struct
可以映射到多个页面结构。因此,一个
vm\u area\u struct
可能适合N*4KB。假设页面大小为4KB,N=1,2,…,X