操作系统和加载器

操作系统和加载器

2025 南京大学《操作系统原理》
操作系统和加载器

加载器是内核实现的一部分

execve(path, argv, envp)

  • 操作系统内核解析 path、完成加载
  • 还有代码 (binfmt_elf.c)
    • 可以在源码里找到手册 (System V ABI)中的概念
      • argc, argv, envp:
        if (put_user(argc, sp++))
                return -EFAULT;
        
    • 关键字搜索:PT_LOAD
    • 有代码的地方就有 bug: CVE-2024-46826
2025 南京大学《操作系统原理》
操作系统和加载器

等等

运行程序的两种方法

  • /bin/ls (这是一个 ELF) v.s. ./a.py (这可是文本啊!)
#include <unistd.h>
#include <stdio.h>

int main() {
    char *args[] = {"a.py", NULL};
    extern char **environ;

    execve(args[0], args, environ);

    // 如果execve失败,执行到这里
    perror("execve");
    return 1;
}
2025 南京大学《操作系统原理》
操作系统和加载器

#! - Shebang

UNIX 对 # 注释的 “妙用”

  • any_file: #!A B C

    • 操作系统会执行 execve(A, ["A", "B C", "any_file"], envp)
    • (我们的 FLE 文件是可以直接执行的)
  • Linux 的实现:binfmt_script.c

    • 优先使用 #! 作为解释器 (Magic Number)
/* Not ours to exec if we don't start with "#!". */
if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
        return -ENOEXEC;
...
file = open_exec(i_name);
2025 南京大学《操作系统原理》