【问题标题】:C files for init ELF executable?用于init ELF可执行文件的C文件?
【发布时间】:2015-11-23 00:08:02
【问题描述】:

我有几个问题,我试图用谷歌搜索,但无济于事。因此,将其发布在这里。提前感谢您的宝贵时间。

  1. 在 linux(我使用 Ubuntu)中哪里有可以生成 init 可执行文件的 C 文件?内核模块如何调用init;在到达内核/boot/vmlinuz 文件后,引导加载程序如何调用init 模块?

  2. 有没有办法追踪哪个函数调用了init 函数? 到目前为止我尝试了什么:尝试通过 readelf 和 nm 但无法追溯到使用它们的被调用方。

  3. systemd 替换 init 后的引导过程。我了解到,首先调用与 udev 和 d-bus 相关的侦听套接字;然后每个进程启动并连接到这些套接字。但我需要清楚地了解系统的工作原理。

如有必要,请帮我指出相关链接。我已经提到的几个链接是:

但他们解释的方式很抽象。

【问题讨论】:

  • 这个问题太宽泛了。考虑将其拆分为多个问题以获得更好的答案。
  • 下面几乎涵盖了每个查询,我将按照建议为最后一个查询启动其他线程。将其标记为已关闭,最后更新的答案为已完成。

标签: c linux init systemd


【解决方案1】:

在 linux(我使用 Ubuntu)中哪里有 C 文件可以生成 init 可执行文件?

这取决于哪个包提供了init 可执行文件。在默认的 Ubuntu Utopic 安装中,/sbin/init 是指向/sbin/upstart 的符号链接,因此您需要找到upstart 的源代码。使用您最喜欢的搜索引擎进行简单搜索可能会将您指向 the Upstart page,其中包括指向源下载和 VCS 存储库的链接。

您还可以使用apt-get source 命令下载特定软件包的源代码。您还需要安装dpkg-dev 包(apt-get install dpkg-dev),之后您可以运行:

apt-get source upstart

之后您将拥有:

root@ubuntu:~# ls upstart-1.13.2/
ABOUT-NLS   config.guess  contrib  extra       ltmain.sh    po            TODO
aclocal.m4  config.h.in   COPYING  HACKING     m4           README        util
AUTHORS     config.rpath  dbus     init        Makefile.am  README.tests
ChangeLog   config.sub    debian   INSTALL     Makefile.in  scripts
compile     configure     depcomp  install-sh  missing      test
conf        configure.ac  doc      lib         NEWS         test-driver

在 Ubuntu Vivid 上,/sbin/init 是指向/lib/systemd/systemd 的符号链接,因此您需要获取systemd sources

请注意,upstart 和 systemd 的运行方式与旧的 /sbin/init 系统非常不同。上述链接中的文档描述了每个系统的运行方式。

如何从内核模块调用init;进入内核 /boot/vmlinuz 文件后,引导加载程序如何调用 init 模块?

引导加载程序不调用init。引导加载程序加载并执行内核。

有没有办法跟踪哪个函数调用了 init 函数?到目前为止我尝试了什么:尝试通过 readelf 和 nm 但无法追溯到使用它们的被调用者。

我不清楚你想在这里做什么。内核调用/sbin/init。也许this question 是相关的。

systemd 替换 init 后的引导过程。我了解到,首先调用与 udev 和 d-bus 相关的侦听套接字;然后每个进程启动并连接到这些套接字。但我需要清楚地了解系统的工作原理。

正如我之前所说,systemd 没有取代 init,它取代了 upstart,而 upstart 取代了 init。希望 systemd 网站上提供的文档能够帮助您了解事情是如何工作的。否则,如果您就不清楚或行为不符合您认为应有的具体问题提出问题,您可能会得到更好的答案。

【讨论】:

  • 非常感谢您在提到的几个主题中得到了清晰的说明。 @larsks ..关于,“引导加载程序不调用init。引导加载程序加载并执行内核。” -> 我的问题原来是;内核执行后;何时调用 init 二进制文件。在调用 init 和其他用户空间应用程序的过程中会启动什么。如果可能的话,请解释一下w.r.t。 systemd 初始化。
【解决方案2】:

我对您的问题有点困惑,因为您指的是“init 函数”和“init elf 可执行文件”。

我会给你参考 linux 内核源代码,因为这些问题在代码中很容易回答: init 在启动时由内核直接调用start_kernel 然后调用rest_init 创建init 进程执行线程和init 进程任务结构。 init 线程开始在内核中的kernel_init 处执行,它快速调用run_init_process,后者调用do_execve(内核等效于execve)。调用 do_execve 后,init 进程已启动。

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 2012-12-09
    • 1970-01-01
    • 2013-06-21
    • 2011-02-23
    • 2021-08-16
    • 2014-08-10
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多