精灵跑者

ELF 运行程序是负责基于标准可执行文件(ELF 格式)启动组件的运行程序。它是一个内置的 runner,可供所有组件使用。

使用 ELF Runner

如需使用 ELF Runner,组件的清单必须包含一个 program 块,其中包含:

{
    program: {
        runner: "elf",
        binary: "bin/foo",
    }
}

  • runner 字段,其值设置为字符串 elf
  • binary 字段,其值设置为组件软件包中的二进制输出名称。

字段

此外,ELF 运行程序还接受一组可选字段,用于配置 ELF 组件的运行时环境。

参数

可以使用 args 字段将实参(即大多数编程语言中的 argv)传递给组件的进程。此字段接受字符串向量(请参阅下方的示例)。 所设置的实参将按清单中声明的顺序传递。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        args: ["--verbose", "--debug"]
    }
}

转发 stdout 和 stderr 流

ELF 组件的 stdout 和 stderr 流可以路由到 LogSink 服务。默认情况下,只有在 LogSink 可供组件使用时,ELF 运行程序才会转发这些流。如果您的组件将诊断消息输出到这两个流中的任何一个,您都应将这些流转发到 LogSink 服务

如需启用此功能,请将以下内容添加到清单文件中:

{
    include: [ "syslog/client.shard.cml" ],
}

包含此分片后,所有写入 stdout 的内容都会记录为 INFO 消息,所有写入 stderr 的内容都会记录为 WARN 消息。消息按换行符拆分,并解码为 UTF-8 字符串。无效的字节序列会转换为 U+FFFD 替换字符,该字符通常显示为

无论是否包含 syslog 分片,都可以使用明确的标志停用此功能:

    program: {
        runner: "elf",
        binary: "bin/foo",
        forward_stdout_to: "none",
        forward_stderr_to: "none",
    }

生命周期

组件具有生命周期。如果您向组件清单添加 lifecycle 属性,则由 ELF 运行程序运行的组件可以与生命周期集成。目前,stop 是 Lifecycle 协议中唯一的方法。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        lifecycle: { stop_event: "notify" },
    }
}

程序应获取生命周期渠道的句柄,并在该渠道上提供 Lifecycle 协议。该组件应在接收并处理 stop 调用后退出。

ELF Runner 会监控其启动的进程,以获取组件的程序二进制文件。如果此进程退出,ELF 运行程序将终止组件的执行上下文,包括组件的作业和所有子进程。

安全

有几个特权字段受许可名单限制。只有此许可名单中包含的组件才能使用这些字段。对于所有字段,该政策适用于组件中的第一个进程。第一个进程是由 ELF 运行程序为 program 块中声明的二进制文件创建的。所有字段均为布尔值,默认值为 false

主要流程关键

main_process_critical 字段可用于将组件的第一个进程标记为对组件管理器的作业至关重要,如果该进程以非零代码退出,则会导致组件管理器(以及所有组件)终止。这会强制系统触发硬重启。

Ambient VMO Exec

ambient_mark_vmo_exec 字段可用于允许组件的第一个进程使用 zx_vmo_replace_as_executable,并将 ZX_HANDLE_INVALID 作为第二个实参,而不是将具有基本 ZX_RSRC_SYSTEM_VMEX_BASE 的有效 ZX_RSRC_KIND_SYSTEM 作为第二个实参。

创建原始进程

job_policy_create_raw_processes 字段可用于允许组件使用 zx_process_create 创建进程。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_create_raw_processes: "true"
    }
}

是否为共享进程

调用 zx_process_create 时,可以使用 is_shared_process 字段传递 ZX_PROCESS_SHARED 标志。仅当组件的 job_policy_create_raw_processes 也设置为 true 时,才能使用此标志。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_create_raw_processes: "true",
        is_shared_process: "true"
    }
}

具有可用异常渠道的作业

job_with_available_exception_channel 字段可用于确保组件创建为作业的直接后代,该作业将具有可供使用的异常渠道。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_with_available_exception_channel: "true"
    }
}

不良账号政策

job_policy_bad_handles 字段用于配置作业的错误句柄政策。支持的值为 deny_exceptionallow_exception,分别对应于 https://fuchsia.dev/reference/syscalls/job_set_policy#zx_job_pol_basic_v2_and_v1 中记录的 ZX_POL_ACTION_DENY_EXCEPTIONZX_POL_ALLOW_EXCEPTION 操作。

{
    program: {
        runner: "elf",
        binary: "bin/foo",
        job_policy_bad_handles: "deny_exception"
    }
}

环境变量

可以使用 environ 属性为 ELF 组件设置环境变量。此字段必须是字符串向量,其中每个字符串都包含以等号分隔的变量和值。例如,以下示例代码将变量 FAVORITE_ANIMALFAVORITE_COLOR 声明为 catred

{
    program: {
        runner: "elf",
        binary: "bin/echo",
        environ: [
            "FAVORITE_ANIMAL=cat",
            "FAVORITE_COLOR=red",
        ]
    }
}

延伸阅读

如需详细了解进程的创建方式,请参阅 Zircon 程序加载和动态链接