在linux内核中,当我做
时cat / proc / pid / maps
我得到了一些映射/ dev / XXX中文件的条目。我知道这是设备文件,它对应于硬件设备而不是实际文件。 linux内核中的内存管理如何处理这种映射?如果我读取或写入/ dev / XXX会发生什么?
答案 0 :(得分:0)
我认为这是正确的:当设备映射特定的内存区域时,例如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_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