今天學習IIC時,發現有清除BSS段的功能代碼,由于不知道什麼是BSS段,是以上網搜尋相關知識,記錄在此。
BSS(Block Started by Symbol)這個詞最初是UA-SAP彙編器(United Aircraft Symbolic Assembly Program)中的一個僞指令,用于為符号預留一塊記憶體空間。該彙編器由美國聯合航空公司于20世紀50年代中期為IBM 704大型機所開發。後來BSS這個詞被作為關鍵字引入到了IBM 709和7090/94機型上的标準彙編器FAP(Fortran Assembly Program),用于定義符号并且為該符号預留給定數量的未初始化空間。Unix FAQ section 1.3(http://www.faqs.org/faqs/unix-faq/faq/part1/section-3.html)裡面有Unix和C 語言之父Dennis Rithcie對BSS這個詞由來的解釋。
一般C語言的編譯後執行語句都編譯成機器代碼,儲存在.text段;已初始化的全局變量和局部靜态變量都儲存在. data段;未初始化的全局變量和局部靜态變量一般放在一個叫.“bss”的段裡。 我們知道未初始化的全局 變量和局部靜态變量預設值都為0,本來它們也可以被放在.data段的,但是因為它們都是0,是以為它們在.data段配置設定空間并且存放資料0是沒有必要 的。 程式運作的時候它們的确是要占記憶體空間的,并且可執行檔案 必須記錄所有未初始化的全局變 量和局部靜态變量的大小總和,記為.bss段。 是以.bss段隻是為未初始化的全局變量和局部靜态變量預留位置而已,它并沒有内容,是以它 在檔案中也不占據空間。
資料段包含經過初始化的全局變量以及它們的值。 BSS 段的大小從可執行檔案中得到 ,然後連結器得到這個大小的記憶體塊,緊跟在資料段後面。當這個記憶體區進入程式的位址空間後全部清零。包含資料段和 BSS 段的整個區段 此時通常稱為資料區。
在采用段式記憶體管理的架構中(比如intel的80x86系統),bss段(Block Started by Symbol segment)通常是指用來存放程式中未初始化的全局變量的一塊記憶體區域,一般在初始化時bss 段部分将會清零。bss段屬于靜态記憶體配置設定,即程式一開始就将其清零了。
比如,在C語言之類的程式編譯完成之後,已初始化的全局變量儲存在.data 段中,未初始化的全局變量儲存在.bss 段中。在《Programming ground up》裡對.bss的解釋為:There is another section called the .bss. This section is like the data section, except that it doesn’t take up space in the executable.text和data段都在可執行檔案中(在嵌入式系統裡一般是固化在鏡像檔案中),由系統從可執行檔案中加載;而bss段不在可執行檔案中,由系統初始化。
總體來說,程式源代碼被編譯以後主要分成兩種段:程式指令和程式資料。代碼段屬于程式指令,而資料段和.bss段屬于程 序資料。 很多人可能會有疑問:為什麼要那麼麻煩,把程式的指令和資料的存放分開?混雜地放在一個段裡面不是更加簡單?其實資料和 指令分段的好處有很多。主要有如下幾個方面。
程式的指令和資料分開原因:
一方面是當程式被裝載後,資料和指令分别被映射到兩個虛存區域。由于資料區域對于程序來說是可讀寫的,而指令區域對于程序來說是隻讀的,是以這兩個虛存區 域的權限可以被分别設定成可讀寫和隻讀。這樣可以防止程式的指令被有意或無意地改寫。
另外一方面是對于現代的CPU來說,它們有着極為強大的緩存(Cache)體系。由于緩存在現代的計算機中地位非常重要,是以程式必須盡量提高緩存的命中率。指令區和資料區的分離有利于提高程式的局部性。現代CPU的緩存一般都被設計成資料緩存和指令緩存分離,是以程式的指令和資料被分開存放對CPU的緩 存命中率提高有好處。
第三個原因,其實也是最重要的原因,就是當系統中運作着多個該程式的副本時,它們的指令都是一樣的,是以記憶體中隻須要儲存一份改程式的指令部分。對于指令 這種隻讀的區域來說是這樣,對于其他的隻讀資料也一樣,比如很多程式裡面帶有的圖示、圖檔、文本等資源也是屬于可以共享的。當然每個副本程序的資料區域是 不一樣的,它們是程序私有的。不要小看這個共享指令的概念,它在現代的作業系統裡面占據了極為重要的地位,特别是在有動态連結的系統中,可以節省大量的内 存。比如我們常用的Windows Internet Explorer 7.0運作起來以後,它的總虛存空間為112 844 KB,它的私有部分資料為15 944 KB,即有96 900 KB的空間是共享部分(資料來源見圖3-2)。如果系統中運作了數百個程序,可以想象共享的方法來節省大量空間。關于記憶體共享的更為深入的内容我們将在裝載這一章探讨。