組合語言與程序呼叫

載入器

連結器產出一個躺在磁碟上、已完成的可執行檔,但磁碟上的檔案無法執行;處理器只執行位在記憶體中的指令。必須有東西把那個檔案拿來、在記憶體裡安頓好,程式才能開始。那個東西就是載入器(loader),它是作業系統的一部分。當你雙擊一支應用程式、或敲下一個指令時,就是載入器在幕後啟動,讓程式活過來。

載入器的步驟是具體的。它讀取可執行檔的標頭,得知程式有多大、又如何分成各個區段(程式碼、已初始化的資料等等)。它為這個行程配置記憶體,把那些區段複製或記憶體映射到正確的位置,設好唯讀的程式碼區與可寫的資料區。它安排好初始堆疊(常把命令列引數與環境變數放在那裡),設定堆疊指標,最後把控制權交給程式的進入點,讓第一道指令開始跑。有了虛擬記憶體,每支程式都像是擁有一個乾淨、屬於自己的位址空間被載入,儘管許多程式其實共用同一台實體機器。

載入器之所以重要,是因為它是從「建置好的程式」到「執行中的行程」之間的最後一座橋。在概觀層級,想像一次乾淨的交接:連結器做出可執行檔,載入器把它放進記憶體並啟動它,之後程式就跑了起來。在動態連結下載入器要做額外的工作,因為有些函式庫的程式碼是被刻意排除在可執行檔之外的;動態載入器必須在載入時找到那些共享函式庫、把它們映射進來、並修補剩下的引用,程式才能使用它們。

執行 ./myprog 時:載入器 (1) 打開可執行檔、讀取它的標頭,(2) 配置記憶體,把程式碼區段映射為唯讀、資料區段映射為可寫,(3) 用引數設好堆疊、把堆疊指標指向它,最後 (4) 跳到程式的進入點。直到此時,你的 main 程式碼才開始執行。

載入器把磁碟上被動的檔案變成記憶體中活的行程,再把控制權交給它的第一道指令。

連結器與載入器是不同階段:連結器在建置時跑一次以產出可執行檔;載入器則在你每次啟動程式時都跑一遍,把它放進記憶體並啟動。

又称
program loader載入程式