init ELF可执行文件的C文件?

时间:2015-08-28 10:44:12

标签: c linux init systemd

我有一些问题,我试图谷歌找出来但是徒劳无功。因此,在此发布。提前感谢您的时间。

  1. Linux中可用的C文件(我使用Ubuntu)生成init可执行文件?如何从内核模块调用init;引导程序在到达内核init文件后如何调用/boot/vmlinuz模块?

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

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

  4. 如有必要,请帮我指出相关链接。我已经提到的链接很少:

    但他们解释的方式非常抽象。

2 个答案:

答案 0 :(得分:0)

  

Linux中可用的C文件(我使用Ubuntu)在哪里生成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;引导程序在到达kernel / boot / vmlinuz文件后如何调用init模块?

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

  

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

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

  

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

正如我之前所说,systemd没有替换 init ,它取代了 upstart ,而 upstart 取代了 init < / em>的。希望systemd网站上提供的文档能够帮助您了解工作原理。如果没有,如果您询问有关具体事情的问题,您可能会得到更好的答案,这些事情不清楚或不符合您的想法。

答案 1 :(得分:0)

我对你的问题感到有点困惑,因为你指的是&#34; init函数&#34;和&#34; init elf可执行文件&#34;。

我将为您提供Linux内核源代码的参考,因为这些问题在代码中有简单的答案: 内核在引导时start_kernel直接调用init 然后调用rest_init来创建init进程执行线程和init进程任务结构。 init线程在kernel_init的内核中开始执行,快速调用run_init_process调用do_execve(内核相当于execve)。在调用do_execve之后,init进程已经开始。