關於bss段的一些思考

2021-10-12 12:41:22 字數 934 閱讀 7727

bss段是用來存放:

未初始化的全域性變數

未初始化的靜態區域性變數

初始化為0的全域性變數(部分編譯器會將它放到data段)

初始化為0的靜態區域性變數(部分編譯器會將它放到data段)

bss段在elf格式的可執行檔案中是不占用空間的,只會記錄它的大小等一些標記性資料,具體細節不討論。

作業系統下的應用程式需要在main函式執行前先執行一段引導**,這段**中包含了清零bss段等準備工作,這裡具體細節不是很清楚,猜測部分是由作業系統完成,部分是編譯器提供的**在鏈結時加入到程式中。

在沒有作業系統的嵌入式裸機程式中,程式在執行階段**和資料都在記憶體(sram或dram)中。我們需要的是bin(格式轉換工具負責將elf轉換成bin格式)檔案,也就是映象檔案,該檔案是真正可以被拷貝到記憶體(sram和dram)中並被cpu直接識別執行的。在bin檔案中,bss段需要占用空間嗎,答案本來應該是肯定的,但這裡有一點需要注意,當連線指令碼中將bss段作為最後乙個段時,我們會發現它不會占用bin檔案的大小;如果bss段不是最後乙個段時,他就會占用bin檔案大小並且將這部分寫為零。這裡對於不同的格式轉換工具可能不同。另外因為沒有了作業系統幫我們完成清零bss段,所以這需要我們自己完成

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

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

關於bss段的理解

bss不佔據程式可執行程式大小,只在段表中記錄大小,在符號表中記錄符號。當檔案載入執行時,才分配空間以及初始化。bss段的大小,記錄在段表裡裡,記錄的是所有未初始化變數總共的大小,bss段只在段表裡有個記錄,但實現並不存在這個段.static int g static short int h int...

關於SpringIOC的一些思考

ioc是 依賴倒置原則 的乙個特例,說其是特例,就是說其具有 依賴倒置原則 的性質。依賴倒置原則強調的兩點是 上層模組和下次模組都依賴於抽象,二者之間通過這種抽象的東西聯絡在一起 具體可以依賴於抽象,而抽象不能依賴於具體。我認為spring提倡的 基於介面程式設計 就是為了遵循 依賴倒置原則 其中所...

關於sizeof 的一些思考

今天面試被問到sizeof,回來整理一下。1 定義 sizeof是c c 中的乙個操作符 operator 作用就是返回乙個物件或者型別所佔的記憶體位元組數。msdn上的解釋為 the sizeof keyword gives the amount of storage,in bytes,assoc...