2015-08-28 53 views
0

我有几个问题,我试图谷歌找出来,但徒劳。因此,在这里发布。在此先感谢您的时间。初始化ELF可执行文件的C文件?

  1. 哪里C文件在Linux(我使用Ubuntu)可产生init可执行文件?如何从内核模块调用init;引导加载程序在与内核/boot/vmlinuz文件联系后如何调用init模块?

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

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

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

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

+2

这个问题的方式过于宽泛。考虑将其分成多个问题以获得更好的答案。 – larsks

+0

几乎每个查询都在下面介绍,我将按照建议启动其他线程来查询最后一个查询。将其标记为关闭,最后更新的答案已完成。 –

回答

0

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

这取决于哪个软件包提供了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 

在这之后,你将有:

[email protected]:~# 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生动,/sbin/init是一个符号链接/lib/systemd/systemd,所以你将想要获得systemd sources

请注意,新贵和systemd的操作与传统的/sbin/init系统有很大不同。上述链接中的文档描述了每个系统的运作方式。

如何从内核模块调用init; bootloader在联系到内核/ boot/vmlinuz文件后如何调用init模块?

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

有没有办法追查其函数调用初始化函数?我到目前为止的尝试:试图通过readelf和nm,但无法追溯到使用它们的被调用者。

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

启动程序systemd后更换初始化。我了解到,侦听套接字首先与udev和d-bus有关;然后每个进程启动并获得连接到这些套接字。但我需要清楚了解系统的工作原理。

正如我刚才所说,systemd并没有取代INIT,它取代新贵新贵更换初始化。希望systemd网站上提供的文档能够帮助您理解事情的工作方式。如果不是这样,如果您提出有关具体事情不明确或不按照您认为应该如此行事的问题,您可能会得到更好的答案。

+0

非常感谢您在提到的几个主题中获得清晰的内容。 @larsks ..关于“Bootloader不调用init,bootloader加载并执行内核”。 - >然后我的问题就变成了;内核得到执行后; init是什么时候调用的。在调用init和其他用户空间应用程序的过程中都发起了什么。如果可能的话请解释一下w.r.t.系统初始化。 –

0

我有点困惑你的问题,因为你指的是“初始化函数”和“初始化ELF可执行”。

我给你的Linux内核源代码的参考,因为这些类型的问题在代码简单的答案: INIT直接由内核在启动时调用start_kernel 然后调用rest_init它创建init进程执行线程和init进程任务结构。在init线程kernel_init从而迅速调用run_init_process这就要求do_execve(内核的execve等同的)开始在内核中执行。在调用do_execve之后,init进程已经启动。