天天看點

關于bss段的一些思考

bss段是用來存放:

未初始化的全局變量

未初始化的靜态局部變量

初始化為0的全局變量(部分編譯器會将它放到data段)

初始化為0的靜态局部變量(部分編譯器會将它放到data段)

bss段在elf格式的可執行檔案中是不占用空間的,隻會記錄它的大小等一些标記性資料,具體細節不讨論。
作業系統下的應用程式需要在main函數執行前先執行一段引導代碼,這段代碼中包含了清零bss段等準備工作,這裡具體細節不是很清楚,猜測部分是由作業系統完成,部分是編譯器提供的代碼在連結時加入到程式中。
在沒有作業系統的嵌入式裸機程式中,程式在運作階段代碼和資料都在記憶體(SRAM或DRAM)中。我們需要的是bin(格式轉換工具負責将elf轉換成bin格式)檔案,也就是鏡像檔案,該檔案是真正可以被拷貝到記憶體(SRAM和DRAM)中并被cpu直接識别運作的。在bin檔案中,bss段需要占用空間嗎,答案本來應該是肯定的,但這裡有一點需要注意,當連接配接腳本中将bss段作為最後一個段時,我們會發現它不會占用bin檔案的大小;如果bss段不是最後一個段時,他就會占用bin檔案大小并且将這部分寫為零。這裡對于不同的格式轉換工具可能不同。另外因為沒有了作業系統幫我們完成清零bss段,是以這需要我們自己完成

對于單片機這種東西就比較特殊,它是在NorFlash裡運作但是變量在SRAM中,這時代碼和部分資料在Flash中,部分資料在記憶體中,有時将程式直接下載下傳到SRAM中運作時代碼和資料都在記憶體中。同樣需要清理bss段,這部分代碼已經在庫提供的.s檔案中被調用完成不需要我們幹涉隻需要正确配置IDE中的值即可。這種情況下bss段會占用bin檔案大小嗎,bss段如果不是最後一個段呢,按理說單片機這種情況最好是NorFlash中的bss段這部分不占空間最好,因為占了根本沒用,它隻在SRAM中才有用;不占的話在程式運作前期将變量資料部署到SRAM中時一些東西就不太好處理,例如bss段不是最後一個段時就不知道要在SRAM中配置設定多大空間給bss段這部分資料,而且有時我們可能會将程式直接下載下傳到SRAM中運作,總之這裡需要考的東西還挺多,具體怎麼實作的就沒去深入研究了。

之是以需要SRAM是因為Norflash讀寫速度較慢(當然這裡不能一概而論,因為實際的系統中包含有指令緩沖和資料緩沖等,并且對代碼進行優化的話有時Norflash的讀速度還會更加快一點,但是寫入速度Norflash就差了很多)并且多次擦寫會損壞,排除這兩點我想可能就不需要SRAM了吧,隻是要注意資料掉電不會丢失。

以上内容是我自己在學習時的一些思考和了解,因為能力有限,部分猜測和結論可能不準确,如有不對的地方或者更深入的解釋還請給予補充和指正。

繼續閱讀