什麼是BSS段

來源:互聯網
上載者:User

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)。如果系統中運行了數百個進程,可以想象共用的方法來節省大量空間。關於記憶體共用的更為深入的內容我們將在裝載這一章探討。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.