簡體   English   中英

如何在linux程序和運行Wine(同一台計算機)的Windows程序之間共享內存?

[英]How to share memory between linux program and windows program running through Wine (same computer)?

是否有一種方法(以及如何)在Linux程序和通過wine運行的Windows程序之間共享內存?

由於可能很難理解為什么要做這樣的事情,我告訴你我的情況:我有一個僅為windows編譯的專有程序,但是這個程序有一個開放的C插件API。 但是,我想讓我的代碼的一部分在本機應用程序上運行(並使用其他庫和linux的其他優點),並以快速的方式執行IPC

我不確定這是一個好主意,或者它是否可行,但您可以在/dev/shm創建文件並從Wine和您的本機Linux應用程序訪問它們。

它不能保證存在,所以你應該有一個后備IPC方法。

https://superuser.com/questions/45342/when-should-i-use-dev-shm-and-when-should-i-use-tmp

否則,您可以嘗試構建可以從Linux調用Windows代碼的winelib應用程序: http ://web.archive.org/web/20150225173552/http://wine-wiki.org/index.php/WineLib#Calling_a_Native_Windows_dll_from_Linux。 我也不確定它是否會起作用。

Wine的目的是在Unix(類似)系統上提供類似WinAPI的環境。 這意味着Wine可以被認為是一個單獨的,API獨立的“獨立”操作系統,位於類Unix系統之上。 因此,你說的那台機器實際上可能有兩個操作系統,一個在另一個上。 首先,“真實”(控制真實硬件)之一,即GNU / Linux。 其次,在POSIX / SUS接口之上有稱為Wine的WinAPI實現。

而且,就人類而言,只有一種便攜式方法可以在具有不同操作系統的機器之間創建進程間通信,而且,正如您可能已經注意到的那樣,我指的是套接字。

Wine子系統本身可以被視為半虛擬機,與Linux內核隔離,但同時與它緊密耦合。

出於效率目的,我的建議是將什么套接字與我稱之為SHMNP(共享內存網絡協議)的套接字一起使用,以提供網絡范圍的共享內存。 再說一遍,記住,兩台“機器”(雖然它只是一台機器)應該是獨立的。 Wine實現太臟了,笨拙的細節很容易被工作 - 雖然這與Cygwin的黑客相比沒什么

SHMNP以這種方式工作。 但是請注意,該SHMNP 存在! 這只是理論上的,並且由於顯而易見的原因而沒有提出協議結構

  • 兩台機器都創建了自己的套接字/共享內存區域(假設它們先前協商了區域的大小)。 同時,他們選擇一個端口號,其中一台機器成為服務器,另一台成為客戶端。 連接已初始化。

  • 最初,兩台機器中的所有“共享”內存都包含未初始化的數據(另一台機器可能對任何給定的共享內存塊具有不同的值)。

  • 在連接關閉之前,如果兩台機器中的任何一台機器寫入共享內存區域的任何地址,則應將消息發送到另一台機器並顯示更改的信息。 Linux內核的時髦功能可能被利用,甚至允許原始指針與此完美配合(見下文)。 但是,我並不知道在Windows中這樣做,而是通過專門的ReadNetworkShared()WriteNetworkShared()類程序。

  • 實現可以提供某種同步機制,因此允許網絡范圍的信號量,互斥量

Linux內核特有的怪癖:大多數現代通用硬件架構和操作系統提供了一種保護內存免受用戶進程惡意/錯誤/無意使用的方法。 每當您讀取/寫入未映射到進程虛擬地址空間的內存時,CPU都會通知操作系統內核發生了頁面錯誤 隨后,內核(如果是Unix(類似))將向違規進程發送分段違例信號,或者換句話說,您將收到SIGSEGV。

隱藏的神奇秘密是SIGSEGV可能被捕獲並被處理。 因此,我們可以mmap()一些內存(共享內存區域),用mprotect()將其標記為只讀,然后,每當我們嘗試寫入共享內存區域中的地址時,該進程將收到一個SIGSEGV。 信號處理程序隨后在內核傳遞的siginfo_t執行檢查,並推斷出兩個動作之一。

  • 如果故障地址不在共享內存區域,則為abort()或其他。
  • 否則,要寫入的頁面應復制到臨時存儲器(可能借助splice() ?)。 然后,將要寫入的頁面標記為讀/寫,並設置一個計時器,以便在超時內將頁面再次標記為只讀,並且發送舊副本和現在寫入頁面之間的(可能是壓縮的)差異通過套接字(SIMD可能會幫助你)。 然后處理程序返回,允許寫入(可能還有其他寫入!)完成,無需進一步干預,直到計時器觸發。

每當一台機器通過套接字接收壓縮數據時,它就會被解壓縮並寫入它所屬的位置。

希望這對你有所幫助!

編輯 :我剛剛發現了編輯前設計的明顯缺陷。 如果將(壓縮的)頁面發送到另一台計算機,則該另一台計算機將無法區分頁面中已修改的數據和尚未修改的數據。 這涉及競爭條件,接收機器可能丟失尚未發送的信息。 但是,一些Linux內核特定的東西修復了它。

暫無
暫無

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

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