2015-08-28 60 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進程已經啓動。