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= (帮助)

外部链接 编辑