簡體   English   中英

將內核模塊與用戶空間程序通信的最佳方式是什么?

[英]What is the best way to communicate a kernel module with a user space program?

這個問題看起來很簡單,但我想發送一個事件來通知我的用戶空間程序模塊緩沖區已准備好被讀取。

例如,我的內核模塊中有一個緩沖區,它的數據將被用戶空間程序消耗。 如果所有數據都被消耗了,內核模塊必須在新數據到達時通知我的程序。

這是生產者/消費者的典型問題。 生產者是一個內核模塊,消費者是一個用戶空間程序。

今天,我向我的程序(事件)發送一個信號並使用 ioctl 函數訪問數據緩沖區。 但我不知道這種方法是否足以解決此類問題。 我害怕不必要地使用 netlink 或內存映射來解決這個問題。

閱讀其他一些可以做你想做的事情的模塊。

在 Linux 內核中有很多關於如何執行此操作的選項,包括:

  • 虛擬文件系統,例如/proc、/sys、configfs、relayfs(真的看看relayfs)
  • 網絡鏈接
  • 阻塞系統調用
  • poll() / epoll() 及相關

/proc 可能是最容易開始的,因為它一直存在並且有大量關於如何使用它的文檔。 創建一個映射到您的緩沖區的虛擬文件,然后讓您的用戶空間應用程序打開一個 fd 並使用 select。 簡單而無處不在。 有更現代和“更好”的方法 - 它們將不可避免地用 /proc + select() 來描述,所以首先學習這些方法會教你一些有用的東西。

為了共享內核模塊的狀態信息,我建議使用任何一種可用的虛擬文件系統(例如: /proc/sys或者如果您正在調試debugfs )。

但是,如果您想在內核之間來回傳輸大量數據,那么您可以考慮使用netlink 套接字或使用mmap這可能是傳輸數據的最快機制,盡管您必須實現自己的通知機制來通知數據准備好時的用戶空間程序,反之亦然(用於消費)。

有關 Linux 下可用的所有可能選項,請參閱鏈接。

有幾種眾所周知的方法可以從用戶空間到內核空間進行通信。

上面列出的所有方法都使用通用方法從用戶空間調用remote procedure call (RPC)到內核空間。

如果你能理解這個http://articles.manugarg.com/systemcallinlinux2_6.html那么你可以在 linux 內核中開發你自己的框架,用於用戶空間到內核空間的通信。

您可以在用戶空間中定義一個變量並將其映射到內核。 當數據准備好時,內核將設置該變量。 在用戶空間,應用程序可以輪詢變量。 設置后,可以執行 ioctl 從內核讀取數據。 缺點是您必須在每個定義的時間輪詢用戶空間中的變量,但好處是您可以避免鎖定機制。

您可以使用 Poll 或在用戶空間中選擇系統調用並在內核空間中輪詢 fops 來實現這一點。 它將被來自用戶空間的輪詢系統調用阻止。 當數據准備好時,從內核空間向用戶空間發送通知/事件。 收到此事件后,進程可以讀取數據。

暫無
暫無

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

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