託管模組結構及執行機制

2021-04-13 07:43:46 字數 1819 閱讀 5469

託管檔案模組組成

pe表頭: 檔案型別:(gui,cui,dll),時間標記(檔案建立時間)

.text部分:包含jmp _corexemain指令

.idata部分,保護mscoree.dll引用

clr表頭: 包含託管模組資訊:clr版本號,main方法的methoddef元資料標記,託管模組的元資料,資源,強命名,標記資訊的位置和尺寸

元資料: 包括元資料表,有兩種,一種描述源**中定義的型別和成員,一種描述源**中應用的型別和成員

中間語言:編譯器編譯**時產生的指令。

清單(manifest)

元資料構成:

元資料是一塊二進位制資料,包含一些表

定義表:

1. moduledef: 包括託管模組的條目,條目主要包括模組的檔名,副檔名等

2. typedef:託管**定義的每乙個型別都在typedef中乙個對應條目,包括型別的名稱,基型別,類似public訪問標記,以及一些指標(指標指向methoddef表中該型別的方法,fielddef中該型別的字段以及propertydef和eventdef表中屬於該型別的成員)

3. methoddef:託管模組中定義的每個方法在methoddef中都對應乙個條目,包括方法名,訪問標記,方法簽名,已經該方法的il**在模組中的偏移量,還包括乙個指向paramdef的指標

4. fielddef:

5. paramdef:

6. propertydef:

7. eventdef:

引用表:

1. assemblyref:託管模組中每乙個引用在assemblyref中都有乙個對應條目,記錄程式集名稱,版本,語言文化以及乙個公有金鑰標記

2. moduleref:用來記錄實現在同一程式集中的其它不同模組的一些型別

3. typeref:

4. memberref:

清單表:

1. assemblydef:

2. filedef:

3. manifestresourcedef:

4. exportedtypesdef:

程式集執行:

編譯期:

1. 編譯器編譯程式時,再pe檔案的.text部分嵌入指令 jmp _corexemain

2. _corexemain函式存在mscoree.dll中,所以mscoree.dll將在pe檔案的.idata部分被引用

執行期:

1. windows載入該pe文集

2. 發現其.idata部分存在mscoree.dll引用,於是載入mscoree.dll,獲取_corexemain函式位址,用此位址修正jmp指令。

3. 程序開始執行修正後的jmp指令, 該指令跳轉倒mscoree.dll中的_corexemain函式,此函式初始化clr, 然後此函式檢視clr表頭的main函式位置。

4. 找到main函式後,pe檔案的il被jit編譯成cpu指令。

5. clr跳轉到編譯後的指令,程式開始執行。

託管方法的呼叫:

1. 方法執行之前,clr會檢查方法中引用到的所有型別。

2. clr為方法分配乙個內部資料結構,用於管理所有引用型別。該方法引用到的所有類都會被分配,該類中的每個方法都有乙個對應的條目,每個條目都將被初始化為乙個沒有記錄的函式(jitcompiler函式)

3. 當呼叫到該條目的時候,jitcompiler被呼叫,其搜尋元資料,找到il位置其將驗證il並編譯為cpu指令(即所謂的及時編譯jit)

4. jitcompiler用cpu指令的位置替換該呼叫方法的位址

5. jitcompiler跳轉到該記憶體**上開始執行

6.如果第二次呼叫將直接使用該方法的位址 

mysql結構及sql執行機制

資料庫通常不會被直接使用,而是由其他程式語言通過sql語句呼叫mysql,由mysql處理並返回執行結果。那麼mysql接受到sql語句後,又是如何處理的呢?首先程式的請求會通過mysql的connectors與其進行互動,請求到處後,會暫時存放在連線池 connection pool 中並由處理器...

PHP CI框架目錄結構及執行機制

ci目錄結構 應用資料夾中主要是存放控制器 模型和檢視等,系統資料夾中主要是存放組成ci的核心檔案的,index.php入口檔案是乙個單一入口檔案,所謂單一檔案是指在乙個 應用程式 中,所有的請求都是指向的這麼乙個檔案,由它負責接收並處理url中的控制器和方法。換句話說,它呼叫乙個 控制器 然後返回...

php CI框架目錄結構及執行機制

ci目錄結構 應用資料夾中主要是存放控制器 模型和檢視等,系統資料夾中主要是存放組成ci的核心檔案的,index.php入口檔案是乙個單一入口檔案,所謂單一文 件是指在乙個 應用程式 中,所有的請求都是指向的這麼乙個檔案,由它負責接收並處理url中的控制器和方法。換句話說,它呼叫乙個 控制器 然後返...