如何处理linux内核中的页面错误?

如何处理linux内核中的页面错误?,linux,memory-management,linux-kernel,Linux,Memory Management,Linux Kernel,我正在从事一个需要对Linux内核进行大量修改的项目。在其中一个修改中,我必须更改页面错误处理程序的工作方式。我希望能够拦截来自特定进程的页面错误,并通过从另一台机器复制数据来尽可能地满足这些错误 作为第一步,我想编写一些实验代码,帮助我理解Linux如何满足页面错误,以及它如何告诉流程页面错误现在无法处理,需要稍后重试 因此,我想修改handle_mm_fault,以帮助我理解以上所有内容。大概是这样的: int handle_mm_fault(struct mm_struct *mm, st

我正在从事一个需要对Linux内核进行大量修改的项目。在其中一个修改中,我必须更改页面错误处理程序的工作方式。我希望能够拦截来自特定进程的页面错误,并通过从另一台机器复制数据来尽可能地满足这些错误

作为第一步,我想编写一些实验代码,帮助我理解Linux如何满足页面错误,以及它如何告诉流程页面错误现在无法处理,需要稍后重试

因此,我想修改
handle_mm_fault
,以帮助我理解以上所有内容。大概是这样的:

int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
                     unsigned long address, unsigned int flags)
{
     /* some code */
     if(current->pid == my_target_pid)
     {
         /*
          1. Chose randomly between 1 and 2 -> rand_num
          2. if rand_num from (1) is 1 then allocate a block of memory, write 'X's to it and then give it to the process and then return.
          3. if rand_num from (1) is 2 then tell process to come back later and then return.
         */
     }
     /* rest of handle_mm_fault for all other process here */
}

您描述的问题听起来像页面要求数据中止。 首先,由于内核空间或用户空间的页面映射无效,可能会发生数据中止。handle_mm_fault是在linux中修复用户空间页表的子程序。据我所知,你的设计必须包括以下内容

  • 您需要一个适当的设计来跟踪正确的PID
  • 您是否考虑过,您如何决定vma的哪一部分应该依赖于需求
    页整个过程是VMA还是只是部分?Linux可以使用其他技术为用户程序创建内存映射,如mmap
  • 为了避免重试,您必须修复映射 因为CPU将从中止位置恢复执行。如果你不能 立即从指定区域为映射提供服务器 应该创建临时映射,稍后再分页

  • 您可以查看
    struct vm\u operations\u struct
    。它的函数成员“fault”用于处理页面错误情况

    您可以在一些安装了NFS的文件系统上进行交换(当然速度非常慢)。这里的问题是理解和更改页面错误处理程序,以及为处理页面错误所需做的最少工作。使用网络进行交换不是问题所在。我只是举个例子。此外,我已经创建了一个网络块设备驱动程序。我不知道你所说的“全过程VMA”是什么意思。我不认为退休人员是有问题的。我认为,在许多情况下,您需要从磁盘或远程位置获取请求的页面,而这些位置的延迟远高于内存的延迟。VMA可以表示代码、数据、BSS、堆或其他部分,您是否打算在处理页面错误时区分这些区域?否,我只想截取特定进程的页面错误并为其提供服务。每个进程通常有多个VMA。为了更好地理解,您可以查看示例文件/proc/PID(xxxx)/maps,它由linux内核为每个进程导出。