linux - `linux_binfmt` 类型的对象是否也描述了已注册的自定义可执行格式?
问题描述
了解 Linux 内核说
可执行格式由 类型的对象描述
linux_binfmt
,它本质上提供了三种方法:load_binary
、load_shlib
和core_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_binary
、load_shlib
和core_dump
方法。这三个方法是从注册中隐式创建的吗?
没有 load_binary
方法,内核调用什么方法通过相应的解释器来执行已注册可执行格式的可执行文件?
解决方案
在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
,然后该函数找到匹配的已注册可执行类型(如果有),加载相应的解释器,并根据需要设置执行环境。
推荐阅读
- sas - 同一列中的日期时间和日期
- sql - 在自联接表中查找所有连接的数据组(图表)?
- google-api - 我可以为不同实例上的同一用户的多个部署的微服务使用单个 Google API 凭据吗?
- sql - Scala,元组的sql插值
- swift - 无法分配 AVAudioPlayer Swift 类型的值
- android - 如何诊断 GCM 结果为“成功”但未到达设备的通知
- c - 关于问题和代码的解释
- sql-server - 如何使用 Kafka 连接将 MS Sql Server 表导入 KSQL
- angular - Angular 项目和上下文根
- javascript - 我们可以设置一个由另一个字段自动计算的字段吗?