知識分享|如何理解程序的內(nèi)部結(jié)構(gòu)
發(fā)布時間:2023-07-28 14:00:11
如何理解程序的內(nèi)部結(jié)構(gòu)
在很多時候,程序需要一些輔助的工具,需要一些平臺支持,使得一個靜態(tài)的、死的軟件程序變成活動的、可以運(yùn)行起來的程序,這就是常說的進(jìn)程。在系統(tǒng)程序中常常會碰到一個可以運(yùn)行其他程序的程序,接下來我們將深入討論,如何理解程序的內(nèi)部結(jié)構(gòu)。
一、為什么要了解程序的內(nèi)部結(jié)構(gòu)
對于嵌人式軟件程序員而言,深入掌握程序的內(nèi)部結(jié)構(gòu),對于程序設(shè)計(jì)是非常重要的。
由于所開發(fā)的程序需要“燒”到 Flash,在運(yùn)行時需要搬遷到內(nèi)存,甚至在運(yùn)行的過程中需要移動位置、被壓縮、解壓縮以及把一個靜態(tài)存放在磁盤的程序加載到內(nèi)存當(dāng)中,并分別將它們的代碼段,數(shù)據(jù)段復(fù)制到合適的位置。
必要的時候還可能要與一個動態(tài)庫相連接,從而解析運(yùn)行時才能確定的一些符號地址。由此看來,深人了解程序,有助于對所設(shè)計(jì)的系統(tǒng)更精確地控制。
那么,程序是什么?一個程序由哪幾部分組成?這個看似極其簡單的問題,要想真正把它弄清楚,卻不那么簡單。
二、程序=代碼+數(shù)據(jù)
首先,無論是應(yīng)用程序,還是系統(tǒng)程序,它們都是程序,也就是說,它們都是一些指令代碼與指令所處理的數(shù)據(jù)的集合,即
程序=(代碼+數(shù)據(jù))
代碼是按照程序員的設(shè)計(jì)意圖設(shè)計(jì)出來供 CPU 執(zhí)行的指令序列。而數(shù)據(jù)可以看成是代碼的處理對象、工作狀態(tài)等的集合。所以一個程序由最基本的代碼段和數(shù)據(jù)段組成。
代碼與數(shù)據(jù)在機(jī)器中都表現(xiàn)為0,1的二進(jìn)制序列,在系統(tǒng)程序中代碼和數(shù)據(jù)并不嚴(yán)格區(qū)分,因?yàn)樽鳛榇a的機(jī)器表示,本身就是數(shù)據(jù)序列。
所有的代碼和數(shù)據(jù)在初始時都存于 Flash或是別的存儲設(shè)備中,例如:EEPROM,CF卡,SD卡,或是移動硬盤。代碼都要被復(fù)制到內(nèi)存或者直接讀到 CPU的指令隊(duì)列之后才能運(yùn)行。
三、堆棧段
一個程序除了代碼段和數(shù)據(jù)段之外為了儲存臨時數(shù)據(jù)變量(包括返回指針以及程序狀態(tài)),一個完整的程序還必須有堆棧段。代碼段、數(shù)據(jù)段和堆棧段是一個程序的基本組成部分。
實(shí)際過程中,數(shù)據(jù)段有許多的變種,例如常量數(shù)據(jù),未初始化數(shù)據(jù),臨時變量數(shù)據(jù),動態(tài)申請數(shù)據(jù)等,因而出現(xiàn)了一些特殊的數(shù)據(jù)段。這些數(shù)據(jù)段有些是在程序生成的過程中靜態(tài)確立的,而有一些卻是程序在執(zhí)行過程中靜態(tài)或動態(tài)分配并初始化的物理空間這就是常見的 BSS段,以及堆(HEAP)。
之所以有這些變種有2個主要意圖:
01-讓系統(tǒng)中的其他程序?qū)嶓w共享有限的物理內(nèi)存資源。
02-節(jié)省可執(zhí)行程序在磁盤(或別的存儲體)中的靜態(tài)存儲空間即目標(biāo)程序的大小。