託管檔案模組組成
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中的控制器和方法。換句話說,它呼叫乙個 控制器 然後返...