跳至內容

binfmt_misc

維基百科,自由的百科全書

binfmt_miscLinux內核的一項功能,其使得內核可識別任意類型的可執行文件格式並傳遞至特定的用戶空間應用程式,如模擬器虛擬機[1]。它是內核中準備用戶空間程序運行的諸多二進制格式文件處理程序之一 [2].。

可執行文件格式透過特殊文件系統binfmt_misc接口註冊(通常掛載在/proc)。註冊流程既可通過向名為register的procfs文件發送特殊序列,也可經由封裝器(如基於Debian發行版的binfmt-support包)[3]亦或是systemdsystemd-binfmt.service服務進行[4][5]

註冊流程

[編輯]

register文件中包含可執行文件該如何被處理的定義。其格式如下所示:

:name:type:offset:magic:mask:interpreter:flags

  • name為二進制格式的名稱。
  • type應為EM類型
    • 若類型為E,則可執行文件格式由其文件擴展名進行識別:magic是與二進制格式相關聯的文件擴展名;此時忽略offsetmask參數。
    • 若類型為M,則可執行文件格式通過文件中的offset的(默認為0)magic數字識別;mask是全默認為 0xFFbitmask,其用於指示數字中存在意義的二進制位。
  • interpreter是將匹配文件作為參數運行的程序(解釋器)。
  • flags(可選)是一系列的字符串,每個控制着interpreter調用的特定方面:
    • P用於保存用戶於命令行中輸入的原程序名(通過將程序名添加到argv);interpreter必須知悉到此標記才能正確將此額外函數作為其argv[0]傳遞至解釋程序。
    • O用於打開程序文件並將其文檔描述符傳遞至interpreter以讀取用戶無法讀取的文件(對於無讀取權限的用戶而言)。
    • C用於根據程序文件而非interpreter文件決定新進程憑證(參見setuid英語setuid);此值默認為O
    • F用於使內核在配置時間而非啟動時間打開二進制文件以使其在其他掛載的用戶空間和chroot中可用。

每個文件格式在/proc/sys/fs/binfmt_misc目錄中都有相應的文件定義項,用戶可在其中獲取特定文件格式的信息。

常見用法

[編輯]

binfmt_misc可使Java程序直接傳遞至Java虛擬機[6]

除此之外,用戶也可通過Wine直接執行可移植可執行文件(為MS-DOSMicrosoft Windows編譯)。舉個例子,下列配置將使用Wine運行DOS和Windows EXE文件(根據「MZ」類型代碼英語type code識別):

:DOSWin:M::MZ::/usr/bin/wine:

要使用Mono運行EXE(.NET)文件:[7][8] :CLR:M::MZ::/usr/bin/mono:

另外,用戶可通過此功能運行為其他架構打造的二進制碼(需要QEMU)。若二進制碼通過binfmt_misc註冊,則其可像原生二進制庫一樣被執行[9]

另請參閱

[編輯]

參考文獻

[編輯]
  1. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  2. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  3. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  4. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  5. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  6. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  7. ^ 存档副本. [2019-05-01]. (原始內容存檔於2019-05-01). 
  8. ^ Guide:Running Mono Applications. [2019-05-01]. (原始內容存檔於2019-06-12). 
  9. ^ Official QEMU mirror. Please see http://wiki.qemu.org/Contribute/SubmitAPatch for how to submit changes to QEMU. Pull Requests are ignored. Please only use release tarballs from the QEMU website. -.., QEMU, 2019-01-26 [2019-01-27], (原始內容存檔於2019-03-27)  外部連結存在於|title= (幫助)

外部連結

[編輯]