2009-10-26 122 views
5

我的問題是關於從內核傳遞數據到用戶空間程序。我想實現一個系統調用「get_data(size,char * buff,char ** meta_buf)」。在這個調用中,buff由用戶空間程序分配,其長度在size參數中傳遞。但是,meta_buf是一個可變長度緩衝區,它被分配(在用戶空間程序的虛擬機頁面中)並由內核填充。用戶空間程序將釋放該區域。從內核線程爲用戶空間分配內存

(我不能在用戶空間分配數據,因爲用戶空間程序不知道meta_buff的大小,而且用戶空間程序不能分配固定數量的內存,並且一次又一次地調用系統調用來讀取整個元數據。meta_data必須在一次系統調用中返回)

  1. 如何從內核線程爲用戶空間程序分配內存? (我甚至會很感激,如果你能指向我的任何其他系統調用做類似的操作 - 在內核中分配和釋放用戶空間)
  2. 這個接口是正確的還是有更好的方法來做到這一點?
+0

最小運行示例:https://stackoverflow.com/questions/10760479/how-to-mmap-a-linux-kernel-buffer-to-user-space/45645732#45645732 – 2017-08-12 01:45:42

回答

11

不要試圖從內核爲用戶空間分配內存 - 這是對內核抽象層的巨大破壞。相反,考慮一些其他選項:

  • 有用戶空間問它需要多少空間。用戶空間分配,然後從內核抓取內存。
  • 將驅動程序擁有的用戶空間mmap頁面直接放入其地址空間。
  • 設置所需數據量的上限。分配那麼多。

這很難說更多不知道爲什麼這必須是原子。實際上,分配內存無論如何都需要中斷(或者你不太可能成功),所以不太可能退出內核會損傷很多。實際上,任何寫入用戶空間內存必須可中斷,因爲頁面錯誤可能需要IO。

相關問題