我理解C编译过程的每一点(如何链接目标文件以创建可执行文件)。但关于装载机本身(启动程序运行)我有一些疑问。
加载程序是内核的一部分吗?
./firefox
或某些命令究竟是如何加载的?我的意思是你通常在终端中输入这样的命令来加载我认为的可执行文件。那么加载器是shell的一个组件吗?
我认为我也很担心终端/ shell适合所有这些以及它的作用是什么。
答案 0 :(得分:1)
相应的系统调用是exec
。它是内核的一部分,负责清理调用旧地址空间并使用所有材料创建一个新的地址空间来运行新代码。这是内核的一部分,因为地址空间是一种保护进程免受其他进程影响的沙箱,因为它是关键的,它负责内核。
shell只负责解释你键入的内容并将其转换为适当的结构(C字符串的列表或数组)以传递给某些exec
调用(在大多数情况下产生了使用fork
)的新流程。
答案 1 :(得分:1)
可执行文件的格式决定了它的加载方式。例如,带有"#!"的可执行文件因为前两个字符是由内核通过执行指定的解释器并将文件作为第一个参数提供给它来加载的。如果可执行文件被格式化为PE,ELF或MachO二进制文件,那么内核会使用内核内置的内容来查找可执行代码和数据,然后选择下一步。
对于动态链接的ELF,下一步是执行动态加载程序(通常是ld.so)以便查找库,加载它们,abd解析符号。这一切都发生在用户空间。内核或多或少没有意识到动态链接,因为在内核将控制权交给ELF文件中命名的interprter之后,它都发生在用户空间中。