簡體   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