簡體   English   中英

內核到用戶空間的通信具有低延遲

[英]Kernel to user space communication with low latency

  • 我的內核模塊從外部GPIO引腳更改接收中斷(上半部分)。
  • 收到中斷后,內核模塊應喚醒或以某種方式調用將開始處理的用戶空間中的函數/線程。 時間很有限。
  • 無需發送數據,僅發送信號即可。
  • CPU是多核的,用戶空間應用將對一個核具有親和力。

進行內核-用戶空間通信的方法有很多。 哪一個延遲最低? 即從ISR到喚醒功能之間的時間 )。

旁注:是的,我可以對它們進行基准測試,我問這個問題的原因是因為我可能不知道所有可能的解決方案

當進程忙於等待該內存位置更改時,中斷處理程序可以直接寫入該進程提供的映射內存范圍。 這甚至可以在上半部分執行,並應為您提供盡可能短的延遲。 確保提供的內存位置已鎖定到物理內存中,因為在isr期間無法分頁。

在數據包套接字和PACKET_MMAP中可以找到類似的方法,其中內核和用戶空間之間的通信是通過共享內存空間進行的(請參閱內核文檔 )。

如果您不關心通過OS進行的資源管理(因為只有一個應用程序正在等待外部輸入),則還可以選擇直接從用戶空間訪問硬件(使用iopl / inb / outb和朋友)。

進程等待內核喚醒的標准方法是使用poll()系統調用,以及設備驅動程序的中斷處理程序喚醒所有等待內核的線程。

您的4個項目符號中列出的最長延遲操作正在喚醒應用程序線程,因此,如果您需要更短的延遲,則需要喚醒線程,但要等待事件。

我使用的最低延遲機制是讓中斷在應用程序過程中寫一個字,並讓線程讀取該字並在值更改時繼續執行。 實際上,是用戶空間和內核空間之間的自旋鎖。 當您可以將CPU內核專用於自旋鎖時,或者當您期望等待時間很短時,請使用此機制。

您可以使用ioctl()將用戶空間指針傳遞給驅動程序,以便它知道要更新哪個單詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM