一個exe文件怎么運行起來的


從OS層說起吧。

OS都有加載程序的功能,一個可執行文件(比如exe,com等)內部都是機器指令(cpu相關的)和數據,所以可執行文件和OS以及編譯器是密切相關的,不同的OS下不同的編譯器產生的可執行文件都不盡相同。不同的平台上其格式大概有elf,pe,coff等。大致都是段的形式來表示。而OS的功能就是讀懂這些文件然后完成從磁盤文件到內存的映射工作,也就是適當的時候把文件的內容搬到內存適當的位置;

OS加載的過程就是進程創建的過程,進程創建完畢后,會找到“入口函數”去執行;

進入入口函數后就等於進入了運行庫,因為入口函數就是運行庫的一部分;

入口函數開始初始化運行程序和程序的運行環境,比如堆的初始化,I/O初始化,線程的准備,全局變量等的初始化;

下一步就進入程序的主體,也就是調用main函數部分。

main函數執行結束后又回到入口函數,此時入口函數要進行一些清理工作。

清理完成后執行一個系統調用來kill掉進程。

 

OK,一個可執行文件的整個執行周期就結束了。

 

對於c語言,運行庫叫crt(c runtime),linux下的crt為glibc,它的程序入口函數為_start,是由匯編語言實現的,包含在crt1.o這個目標庫文件里。在windows下crt為msvc crt,它的入口函數是mainCRTStartup。對於每個程序,鏈接過程都會給你的可執行程序加進一些運行庫目標文件,這樣才保證你的程序是一個獨立的可執行體。正式這些“額外”的代碼把你的main函數調用起來的。

一般在鏈接程序的時候須指定入口函數名。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com