繁体   English   中英

如何在Linux内核中的页面错误处理程序中挂起进程

[英]How to suspend a process in page fault handler in linux kernel

我想在Linux内核中实现IPC。 这个想法是:

  1. 生产者进程可以写入物理页面

  2. 消费者进程只能阅读此页面

  3. 在生产者进程修复此页面之前,消费者进程无法读取此页面(例如,将页面设置为FIXSTATE

我的实现是:当消费者进程读取此页面时,它将调用pagefualt。

页面错误处理程序将使使用者pte(页面表项)指向物理页面,然后挂起使用者进程。 当生产者进程将此页面设置为FIXSTATE ,生产者将找到等待队列并唤醒使用者进程。

我的问题是:

根据我的研究,我无法在页面错误处理程序中调用schedule()来挂起使用者进程,因为它处于中断上下文中。 因此,我将使用者进程状态设置为TASK_UNINTERRUPTIBLE ,然后调用resched_task(current)来指示从pagefault处理程序返回时当前(使用者)进程需要重新计划。 但是resched_task是kernel / sched.c中的静态函数,不能在此文件外部调用。

是否有某种方法可以在页面错误处理程序中挂起/休眠当前进程(该进程调用pagefault)?

预先感谢您的任何答案!

我认为您的前提是错误的。 我不了解所有细节,但我认为您应该在页面错误处理程序的中断上下文中。 由于您是通过异常进入内核模式的,因此中断在进入时被屏蔽(禁用)。 但是您只是来自用户模式(通常,通常;有时页面错误也可能来自内核模式,但在“任务上下文”中),因此您不会处于中断状态。 确实,如果您从中断处理程序中得到了页面错误,则看不到何时不会构成内核错误。

普通的页面错误(例如,如果您的进程由于写时复制或扩展堆栈或其他原因而需要分配新页面)最终将调用handle_mm_fault。 首先,将状态设置为TASK_RUNNING。 然后,它可以立即分配新页面,修复PTE等(满足页面错误),并返回到用户模式,状态为TASK_RUNNING。 或者,它可以阻塞进程,直到有可用内存为止,在此过程中的某个地方,将导致对schedule()的调用,从而允许其他进程在阻塞时运行。

听起来您想要做基本上相同的事情。 因此,只需查看handle_mm_fault在做什么。

(说了这么多,我不明白为什么您不简单地使消费过程进行系统调用以进入“进入消费模式”,这可能会阻塞,直到生产者完成“修复”页面为止。实际上,驱动程序模型已经支持file_operations表入口点,以简化此类操作。如果朝这个方向发展,核心内核将为您处理PTE和其他此类详细信息。 file_operations => mmap以及vm_operations_struct =>故障)

我尚未完全阅读您的问题。 但是我知道一种暂停进程的通用方法。

创建一个等待队列。从运行队列中删除进程,然后添加到等待队列中,等待某个事件。 当您想唤醒进程时,只需发送事件即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM