程式執行 - Linux
By Charlotte
at 2009-11-04T16:10
at 2009-11-04T16:10
Table of Contents
※ 引述《CrBoy (上大學好忙喔)》之銘言:
: ※ 引述《littleboypis (littleboypis)》之銘言:
: : 想請教一下 一隻程式是怎麼在OS(Linux/Windows)執行的?
: : 在OS上執行
: binary的可執行檔會有他自己的格式 例如在Linux上稱為ELF executable
: 在windows上我不敢確定 我都叫他Win32 executable @@"
Windows 上的binary分成 .com 跟 .exe ,基本上.com的格式就是
CP/M Execution Binary, 格式很簡單,就是程式碼一率由0x0100
開始執行,由於x86有Segment的概念,所以OS就很簡單的找一塊區
塊把內容放到RAM裡,然後調整CS讓那個BINARY的對應PC剛好為0x0100
然後就給他CALL進去就對了。至於 .exe 則複雜許多,一般我們大
多知道是所謂的PE格式,其實更正確一點應該說是COFF-PE。Windows
下的Lib,DLL,EXE都是COFF格式的檔案。不管是ELF或COFF基本上得
內容都差不多但格式各有其優點。對於格式細節有興趣的人可以去
拜狗就可以得到細節。
: 可以用$ file filename 來取得檔案的相關資訊
這裡有點意思不一樣,一般來講path+filename 只是讓os知道檔案
在哪,至於能不能執行的細節則是在檔案內的標頭欄位內,exe 跟
unix上加了 x的檔案都是很複雜的執行檔,其中包涵目標機器種類
,二元碼性質描述,是否需要重新連結等等的執行資訊以及可能多
達數段的程式碼與各種不同的材質與資料內容。這些都必需要打開
檔案才能知道的。
: 而作業系統會有loader 負責讀取可執行檔的內容 並載入指令(instructions)
: 到記憶體中 接著才會去執行他(細節我也實在不清楚orz
: 我認為不只是把Program Counter指過去這麼簡單)
基本上Loader的動作大致如下:
開啟檔案 -> 讀取表頭資訊 -> 分析內容
---->不可執行或條件不足則跳出回應錯誤(檔案格式/對應平台類)
依照表頭載入並檢核二元資料(程式碼、資料、材質)
-->發生錯誤則跳出回應錯誤(檔案內容揪錯)
重新連結執行碼->產生執行緒/任務資訊----->發生錯誤則跳出回應錯誤(系統資源類)
指派cpu time開始執行 -->發生錯誤則跳出回應錯誤(執行階段類)
: : 如果在沒有OS上的 又是怎麼一個情況?
: 如果沒有OS的 那就是這個程式本身就要可以執行 細節我也不清楚XDDD
: 不過硬體都會設計剛啟動的時候 會從ROM的哪個地方開始執行
: 而你就必須以那個地方當作開頭來寫入你的程式(的那些指令)
: 最少最少也需要一個jump 讓PC可以跳指到你的程式的主區段
沒有os的話,你就必須確定你的執行碼沒有進行系統呼叫(ex:printf scanf...)
然後使用linker把程式的佈置規劃到rom裡面對應的位置,然後
在CPU 的起始點(0x00000000 或 0xfffffff0)放一個 JMP 跳到
你的ROM 中的程式進入點。然後把這樣的二元檔影像燒到ROM裡
面去,這樣,CPU reset後就會跳進去你的程式碼裡面了。
--
~~~ 一切的正義在曼尼大神的正義之前均無足輕重
在海賊的砲口下唯有曼尼大神的正義可以私下研究 ~~~
-= WolfLord =-
BM4GMR - A23203 -
--
: ※ 引述《littleboypis (littleboypis)》之銘言:
: : 想請教一下 一隻程式是怎麼在OS(Linux/Windows)執行的?
: : 在OS上執行
: binary的可執行檔會有他自己的格式 例如在Linux上稱為ELF executable
: 在windows上我不敢確定 我都叫他Win32 executable @@"
Windows 上的binary分成 .com 跟 .exe ,基本上.com的格式就是
CP/M Execution Binary, 格式很簡單,就是程式碼一率由0x0100
開始執行,由於x86有Segment的概念,所以OS就很簡單的找一塊區
塊把內容放到RAM裡,然後調整CS讓那個BINARY的對應PC剛好為0x0100
然後就給他CALL進去就對了。至於 .exe 則複雜許多,一般我們大
多知道是所謂的PE格式,其實更正確一點應該說是COFF-PE。Windows
下的Lib,DLL,EXE都是COFF格式的檔案。不管是ELF或COFF基本上得
內容都差不多但格式各有其優點。對於格式細節有興趣的人可以去
拜狗就可以得到細節。
: 可以用$ file filename 來取得檔案的相關資訊
這裡有點意思不一樣,一般來講path+filename 只是讓os知道檔案
在哪,至於能不能執行的細節則是在檔案內的標頭欄位內,exe 跟
unix上加了 x的檔案都是很複雜的執行檔,其中包涵目標機器種類
,二元碼性質描述,是否需要重新連結等等的執行資訊以及可能多
達數段的程式碼與各種不同的材質與資料內容。這些都必需要打開
檔案才能知道的。
: 而作業系統會有loader 負責讀取可執行檔的內容 並載入指令(instructions)
: 到記憶體中 接著才會去執行他(細節我也實在不清楚orz
: 我認為不只是把Program Counter指過去這麼簡單)
基本上Loader的動作大致如下:
開啟檔案 -> 讀取表頭資訊 -> 分析內容
---->不可執行或條件不足則跳出回應錯誤(檔案格式/對應平台類)
依照表頭載入並檢核二元資料(程式碼、資料、材質)
-->發生錯誤則跳出回應錯誤(檔案內容揪錯)
重新連結執行碼->產生執行緒/任務資訊----->發生錯誤則跳出回應錯誤(系統資源類)
指派cpu time開始執行 -->發生錯誤則跳出回應錯誤(執行階段類)
: : 如果在沒有OS上的 又是怎麼一個情況?
: 如果沒有OS的 那就是這個程式本身就要可以執行 細節我也不清楚XDDD
: 不過硬體都會設計剛啟動的時候 會從ROM的哪個地方開始執行
: 而你就必須以那個地方當作開頭來寫入你的程式(的那些指令)
: 最少最少也需要一個jump 讓PC可以跳指到你的程式的主區段
沒有os的話,你就必須確定你的執行碼沒有進行系統呼叫(ex:printf scanf...)
然後使用linker把程式的佈置規劃到rom裡面對應的位置,然後
在CPU 的起始點(0x00000000 或 0xfffffff0)放一個 JMP 跳到
你的ROM 中的程式進入點。然後把這樣的二元檔影像燒到ROM裡
面去,這樣,CPU reset後就會跳進去你的程式碼裡面了。
--
~~~ 一切的正義在曼尼大神的正義之前均無足輕重
在海賊的砲口下唯有曼尼大神的正義可以私下研究 ~~~
-= WolfLord =-
BM4GMR - A23203 -
--
Tags:
Linux
All Comments
By Caroline
at 2009-11-07T00:51
at 2009-11-07T00:51
By Thomas
at 2009-11-07T15:26
at 2009-11-07T15:26
By Hardy
at 2009-11-12T10:54
at 2009-11-12T10:54
By Charlie
at 2009-11-15T13:00
at 2009-11-15T13:00
By Steve
at 2009-11-17T04:06
at 2009-11-17T04:06
By Victoria
at 2009-11-17T21:34
at 2009-11-17T21:34
By Liam
at 2009-11-18T19:05
at 2009-11-18T19:05
By Dora
at 2009-11-20T08:09
at 2009-11-20T08:09
By Skylar Davis
at 2009-11-21T17:32
at 2009-11-21T17:32
By Genevieve
at 2009-11-25T00:06
at 2009-11-25T00:06
By Elizabeth
at 2009-11-29T18:48
at 2009-11-29T18:48
By Ida
at 2009-12-01T14:58
at 2009-12-01T14:58
By Linda
at 2009-12-06T02:31
at 2009-12-06T02:31
By Jacob
at 2009-12-08T13:10
at 2009-12-08T13:10
By Doris
at 2009-12-10T02:45
at 2009-12-10T02:45
By Valerie
at 2009-12-12T02:35
at 2009-12-12T02:35
By James
at 2009-12-12T19:32
at 2009-12-12T19:32
By Noah
at 2009-12-16T19:55
at 2009-12-16T19:55
By Michael
at 2009-12-18T02:29
at 2009-12-18T02:29
Related Posts
Ubuntu 9.10 如何不要自動開啟 Wifi?
By Noah
at 2009-11-04T15:51
at 2009-11-04T15:51
程式執行
By Joe
at 2009-11-04T15:04
at 2009-11-04T15:04
程式執行
By Emma
at 2009-11-04T13:37
at 2009-11-04T13:37
如何查看/sbin/init執行時show出的訊息
By Linda
at 2009-11-04T10:59
at 2009-11-04T10:59
GUI Framework
By Faithe
at 2009-11-04T09:04
at 2009-11-04T09:04