如何处理linux内核中的页面错误?
我正在从事一个需要对Linux内核进行大量修改的项目。在其中一个修改中,我必须更改页面错误处理程序的工作方式。我希望能够拦截来自特定进程的页面错误,并通过从另一台机器复制数据来尽可能地满足这些错误 作为第一步,我想编写一些实验代码,帮助我理解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
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中修复用户空间页表的子程序。据我所知,你的设计必须包括以下内容
页整个过程是VMA还是只是部分?Linux可以使用其他技术为用户程序创建内存映射,如mmap
您可以查看
struct vm\u operations\u struct
。它的函数成员“fault”用于处理页面错误情况您可以在一些安装了NFS的文件系统上进行交换(当然速度非常慢)。这里的问题是理解和更改页面错误处理程序,以及为处理页面错误所需做的最少工作。使用网络进行交换不是问题所在。我只是举个例子。此外,我已经创建了一个网络块设备驱动程序。我不知道你所说的“全过程VMA”是什么意思。我不认为退休人员是有问题的。我认为,在许多情况下,您需要从磁盘或远程位置获取请求的页面,而这些位置的延迟远高于内存的延迟。VMA可以表示代码、数据、BSS、堆或其他部分,您是否打算在处理页面错误时区分这些区域?否,我只想截取特定进程的页面错误并为其提供服务。每个进程通常有多个VMA。为了更好地理解,您可以查看示例文件/proc/PID(xxxx)/maps,它由linux内核为每个进程导出。