簡體   English   中英

C ++中的Linux進程加載器

[英]Linux process loader in C++

我正在使用C ++開發Linux平台的進程加載器; 這只是一個娛樂項目。 基本上,我想手動將可執行文件的所有部分加載到內存中,然后執行它。

一周前,我在這里問了一個相關但更具體的問題。 但是,在做了更多閱讀之后,我意識到在我學習如何實際創建過程之前,內存映射將無關緊要。 所以我的問題是,有沒有辦法在Linux上創建一個“空白”的新進程,它有自己的虛擬地址空間(我可以訪問它來加載代碼和數據)?

甚至關於流程加載器開發的一般資源也很有用,因為我還沒有找到任何資源。

如果你有興趣看到Linux進程加載器在你要求它exec()某些東西時在幕后真正做了什么,那么抓住內核源代碼的副本並查看fs/exec.c中的do_execve_common()

如果您嘗試運行ELF二進制文件,最終會被調用的ELF處理程序本身位於fs/binfmt_elf.c 特別是, load_elf_binary()執行實際加載,給定一個struct linux_binprm其中包含從磁盤加載進程映像的必要信息。

觀察到Linux支持的二進制格式有很多binfmt_*.c文件; 如果您有自定義二進制格式,那么原則上您可以編寫自己的格式並將其作為內核模塊提供。 進程加載的內部對用戶模式代碼是不透明的(理所當然的是:如果沒有,則會存在嚴重的安全漏洞)。

您可以使用fork()函數創建一個新進程,該進程將創建父進程的副本,然后使用exec系列函數之一,您可以加載可執行文件並執行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM