1、程式如何執行:
在多道程式環境下,要是程式執行,必須纖維質建立程序。而建立程序的第一件事,便是將程式和資料裝入記憶體。如何將乙個使用者源程式變為乙個可以在記憶體中執行的程式,通常都要經過一下幾個步驟:
首先是要編譯,有編譯程式將使用者源**編譯成cpu可執行的目標**,產生了若干個目標模組(若干程式段)
其次是鏈結,有鏈結程式將編譯後形成的一組目標模組(程式段),以及他們所需要的庫函式鏈結在一起,形成乙個完整的裝入模組。
最後是裝入,由裝入程式將裝入模組裝入記憶體。
(1)絕對裝入方式
在編譯時,就已經知道程式駐留在記憶體中的什麼位置,即程式中的邏輯位址跟實際位址完全相同。
優點:cpu執行目標**快
缺點:(1)由於記憶體大小限制,能裝入記憶體併發執行的程序數大大減少。
(2) 編譯程式必須知道記憶體的當前空閒記憶體和其位址,執行效率低下
(3)絕對裝入方式只適用於單道程式環境
(2)靜態位址重定位
在目標**裝入記憶體的過程中完成,在程式開始執行前,程式中的指令和資料的各個位址均已完成重定位,即虛擬位址到記憶體位址的對映。位址變換通常在裝入是一次完成,以後不在改變。
優點:無需硬體支援
缺點:(1)程式重定位之後就不能再記憶體中搬動了。
(2)要求程式的儲存空間是連續的,不能把程式放在若干個不連續的區域中。
(3)動態位址重定位
在每次訪問記憶體單元前才將要訪問的程式或資料位址變換為記憶體位址。
優點:乙個程式由若干個相對獨立的目標模組組成時,每個目標模組個裝入乙個儲存區域,這些儲存區域可以是不順序相鄰的,只要各個模組有自己對應的定位暫存器就行。
3、程式的連線
源程式進過編譯後,可得到一組目標模組,在利用連線程式將這組目標模組連線,根據連線時間的不同,可將連線分為如下三種:
(1)靜態連線:在程式執行之前,先將各目標模組及他們所需的庫函式,連線成乙個完整的裝配模組,以後不再拆開。
(3)執行時動態鏈結。這是指某些目標模組的連線,是在程式執行中需要該模組時,才對它進行的連線。在執行過程中,當發現乙個被呼叫模組尚未裝入記憶體時,立即由os去找到該模組並將之裝入記憶體,把它鏈結到呼叫者模組上。凡在執行過程中未被用到的目標模組,都不會被調入記憶體和被鏈結到裝入模組上,這樣不僅可加快程式的裝入過程,而且可節省大量的記憶體空間。
載入核心並執行init程式
核心的載入 由boot loader管理而開始讀取核心檔案後,linux將核心解壓到主儲存器中,並利用核心的功能,開始與驅動各個周邊裝置,包括儲存裝置 cpu 網路卡 音效卡等。虛擬檔案系統 initial ram disk 一般使用檔名為 boot initrd 它可以通過boot loader來...
JS執行與頁面載入
我是在csdn的技術問答中看到 js中有沒有jquery.ready這樣的方法 這個問題後,再看到兩篇不錯的文章 深入分析jquery的ready函式是如何工作的 工作原理 jquery document ready 與window.onload的區別 js中定義的事件 window.onload或...
Linux鏈結 載入與執行
鏈結器將多個可重定位目標檔案合併成可執行目標檔案,可執行目標檔案格式同可重定位目標檔案的格式大致相似。elf頭部描述檔案的總體資訊。它還包括程式的入口點 entry point 它指向程式執行時第一條指令的位址。text data rodata各部分節都被重定位到執行時記憶體位址。其中包含乙個 in...