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