首页 > 解决方案 > `linux_binfmt` 类型的对象是否也描述了已注册的自定义可执行格式?

问题描述

了解 Linux 内核

可执行格式由 类型的对象描述linux_binfmt,它本质上提供了三种方法:load_binaryload_shlibcore_dump

Linux 允许用户注册他们自己的自定义可执行格式。/proc/sys/fs/binfmt_misc要注册一种新格式,用户将具有以下格式的字符串写入 binfmt_misc 特殊文件系统(通常安装在 )的寄存器文件中 :

:name:type:offset:string:mask:interpreter:flags

当内核确定可执行文件具有自定义格式时,它会启动适当的解释程序。解释程序在用户模式下运行,接收可执行文件的路径名作为其参数,并进行计算。例如,包含 Java 程序的可执行文件由 Java 虚拟机处理,例如/usr/lib/java/bin/java.

虽然它没有提到这一点,但注册的自定义可执行格式是否也由 type 的对象描述linux_binfmt

如果是,注册自定义可执行格式不需要我们显式提供load_binaryload_shlibcore_dump方法。这三个方法是从注册中隐式创建的吗?

没有 load_binary方法,内核调用什么方法通过相应的解释器来执行已注册可执行格式的可执行文件?

标签: linuxlinux-kernelexecutable-format

解决方案


binfmt-misc的情况下,linux_binfmt对象对应于binfmt-misc模块本身。模块不必提供所有功能的实现;binfmt-misc 只声明一个实现load_binary

static struct linux_binfmt misc_format = {
    .module = THIS_MODULE,
    .load_binary = load_misc_binary,
};

( binfmt_script,它实现了对基于 shebang 的脚本的支持,具有类似的声明。)

load_misc_binary当内核调用它时,处理所有已注册的可执行类型的细节。内核调用load_misc_binary,然后该函数找到匹配的已注册可执行类型(如果有),加载相应的解释器,并根据需要设置执行环境。


推荐阅读