2014-06-11 71 views
2

相關的memcpy在Linux中,是有辦法,同時避免了數據的隱含的memcpy從內核空間到用戶空間從套接字讀取?從插座讀而不從內核空間到用戶空間

也就是說,而不是做

ssize_t n = read(socket_fd, buffer, count); 

這顯然需要內核做從網絡緩衝區的memcpy到我提供的緩衝區,我會做類似

ssize_t n = fancy_read(socket_fd, &buffer, count); 

,並在返回有緩存指向從網絡接收到的非memcpy()'ed數據。

+0

我不這麼認爲,用'shmget' –

+0

@AlterMann究竟是怎樣的shmget()讀取套接字「? – EJP

+0

EJP,替換爲共享內存,當然,插座的概念;) –

回答

3

起初我以爲AF_PACKET選項套接字系列能有所幫助,但它不能。

儘管如此,也可以在技術上,因爲沒有什麼可以阻止你實現內核模塊處理系統調用返回用戶映射指向內核數據(即使它是不是很安全)。

有幾個關於調用問題,你想有:

  1. 內存管理。您如何知道在fancy_read系統調用返回後仍然可以訪問內存?
  2. 你會如何告訴內核最終釋放內存?需要進行某種形式的內存管理,如果您希望內核爲您提供一個非內存內存的安全指針,則需要進入內核才能啓用此功能。試想一下,在你告訴它所有的數據都不能被釋放之前,內核需要跟蹤所有這些返回的指針。

這些可以在很多方面完成,所以基本上是這樣,但是您可能需要考慮很多事情。

相關問題