久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

程序結構分析和理解

作者:龔平   來源:本站原創   點擊數:  更新時間:2014年03月14日   【字體:

最近的一段時間又溫習了一下嵌入式開發的基本工具和程序的一些基本結構,逐漸脫離了機械學習的過程,在學習的過程中了解到自己需要了解的東西還很多。記得我在大學期間學習DSP,當時的任務是完成2048點數據的FFT變換,記得當時程序(C語言)完成很快,但是在后期總是不能出現正確的效果,最后發現原來是CMD(配置)文件存在問題,通過老師的講解以及自己的學習了解到了程序的基本結構,也就是所謂的代碼段,數據段等,以及具體的存儲器管理問題。這些都是鏈接器的基本功能。從此也就知道了程序的一些特點。

 

1、目標文件的構成

二進制文件是由一系列的段構成的,當然也會存在一些符號,存儲器分配等等,從鏈接文本其實就能大概知道程序的組成,各個目標文件的同一段結合起來就實現了可執行程序的鏈接,當然具體的鏈接方式和原則都是工具設計好的。比如鏈接的順序按著輸入的順序等。

 

記得在移植u-boot到TQ2440的過程中,曾經就修改過鏈接文本,也就是u-boot.lds文件,當時因為自己添加了一個關于nand flash 操作的函數,為了保證添加的函數不會在鏈接的過程中將啟動代碼之前而導致芯片啟動存在問題,我特意修改了程序的鏈接順序,保證鏈接文檔正確鏈接。

1.                             [root@Gong-Computer u-boot-2010.06]# vi arch/arm/cpu/arm920t/u-boot.lds

2.                             . = ALIGN(4);

3.                             .text :

4.                             {

5.                             arch/arm/cpu/arm920t/start.o (.text)

6.                             board/samsung/smdk2440/lowlevel_init.o (.text)

7.                             board/samsung/smdk2440/nand_read.o (.text)

8.                             *(.text)

9.                             }

關于二進制文件中的基本內容主要是包括幾個段的。當然還需要其他的一些條件,在鏈接的過程中,好像還需要一些C語言運行的環境,主要是用來控制程序的啟動和關閉。這些都是crt*(C RunTime)目標文件實現的。這些目標文件在我們程序設計中不經?吹剑绻治鲞^u-boot的編譯過程就會發現,這些目標文件確實存在。

鏈接文本使得文件的鏈接更加的方便和實用。因此了解目標的最基本段落是非常的必要的。

在其中需要注意的幾點:

1、靜態變量不管是局部還是全局的都是在數據段中,而不想局部變量在堆棧中,當棧彈出以后,其中的內容也就釋放了,靜態變量不會改變,但是對于局部靜態變量則只能被定義該變量的函數訪問,不能被其他的函數訪問。

2、全局變量、靜態變量如果被初始化為0,或者沒有被初始化,則該變量被分配到.bss(未初始化部分),只有當全局變量和靜態變量初始化為非零數值時才會分配到.data段中。

3、全局變量和靜態變量如果沒有被初始化一般都會默認為0,這也是為什么將這兩個數初始化為0,仍然處在.bss段的原因。因此需要注意全局變量和靜態變量在沒有初始化時的值,但是對于局部變量則沒有這個特點,如果沒有初始化則會出現一個隨機值。

以上的結論可以通過代碼進行手動測試。

2、Linux中程序結構

在Linux中每一個進程都存在一個4G的虛擬空間,其中前3G空間是用戶空間,而后1G空間則是內核空間,這4G的空間在各個進程之間都是相互獨立的。但是這些內存空間的區域分配確實相同的,而且各個區域的起始地址也是固定好的,Linux程序的結構如下:

由于各個段的起始地址都是固定的,這樣就便于虛擬地址到物理地址的映射,方便了程序的加載。特別是共享庫的實現。

3、堆棧和堆

其實我對這兩個概念在剛開始的時候也存在很大的誤解,不明白其中的關系,總是把堆棧理解成堆和棧,實質上堆棧就是指棧,搞清楚這個,兩者的區別就容易理解啦。堆棧其實也可以認為是一種數據結構,典型的先進后出特點。

一般而言堆棧都是反向增長的,也就是所謂的從高地址到低地址的增長方式,但是也有其他的增長方式,比如ARM有4種不同的增長模式,所以堆棧的增長方向只能依據CPU而言,不同的CPU其堆?赡艽嬖谝欢ǖ牟顒e。堆棧主要用來實現函數的調用。

堆一般而言都是在bass段的上面,主要用來實現動態內存的分配和釋放,在C語言中主要是通過malloc/free函數實現,在C++中則主要采用new/delete實現。但是對于這一塊的內存通常會不斷的分配和釋放以及滿足基本的對齊形式,這樣就導致了內存碎片的產生,減小了訪問的速率。同時因為在這段區域運行零空間申請,以及釋放后指針仍然有效等問題,所以在釋放完畢以后通常將指針指向NULL。

關閉窗口

相關文章

主站蜘蛛池模板: 日韩综合在线 | 国产亚洲久 | 九九免费视频 | 日韩精品极品视频在线观看免费 | 国产成人黄色 | 国产麻豆乱码精品一区二区三区 | 人人人人爽 | 国产欧美一级二级三级在线视频 | 亚洲欧美另类在线观看 | 欧美a√ | 国产免费一区二区三区 | 在线一区二区三区 | 精品欧美一区二区三区久久久 | 国产精品99一区二区 | 国产区第一页 | 欧美国产精品一区二区 | 国产综合精品 | 日韩在线播放一区 | 秋霞a级毛片在线看 | 国产精品1区2区 | 国产亚洲欧美在线 | av电影一区二区 | 三级av在线 | 久久国产亚洲 | 欧美黄色免费网站 | av在线播放网址 | 国产成人精品免高潮在线观看 | 国产午夜三级一区二区三 | 男人天堂午夜 | 久久久91精品国产一区二区精品 | 永久av| 欧美在线视频免费 | 日韩精品久久久 | 欧美精品第一页 | 成人在线中文字幕 | 成人精品在线视频 | 久久久69| 欧美日韩国产精品一区二区 | 国产精品久久久久久久粉嫩 | 蜜桃一区 | 亚洲欧美在线观看 |