初始化ELF可执行文件的C文件



我有几个问题,我试图谷歌找出,但徒劳的。因此,把它贴在这里。提前感谢您的时间。

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

  2. 是否有方法跟踪哪个函数调用init函数?到目前为止我所做的:尝试通过readelf和nm,但无法使用它们追踪到被调用者

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

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

  • https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s2-boot-init-shutdown-init.html
  • https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Installation_Guide/ch-boot-init-shutdown.html

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

生成初始化可执行文件的linux(我使用Ubuntu)中可用的C文件在哪里?

这取决于哪个包提供init可执行文件。在默认的Ubuntu Utopic安装中,/sbin/init是指向/sbin/upstart的符号链接,因此您需要找到upstart的源代码。使用您最喜欢的搜索引擎进行简单搜索可能会指向Upstart页面,其中包含到源代码下载和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的源代码。

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

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

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

是否有一种方法来跟踪哪个函数调用init函数?到目前为止我所做的:尝试遍历readelf和nm,但无法使用它们追踪到被调用者。

我不明白你在这里想做什么。内核调用/sbin/init。也许这个问题是相关的。

systemd替换init后的启动过程。我开始理解侦听套接字首先被调用与udev和d-bus相关;然后每个进程启动并与这些套接字建立连接。但是我需要清楚地了解这个系统是如何工作的。

如前所述,systemd没有替换init,它替换了upstart,并且upstart替换了init。希望systemd网站上提供的文档能够帮助您理解工作原理。如果没有,如果你问一些不清楚的事情或者你认为他们应该做的事情,你可能会得到更好的答案。

我对你的问题有点困惑,因为你指的是"init函数"one_answers"init elf可执行文件"。

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

最新更新