作者descent (「雄辯是銀,沉默是金」)
看板C_and_CPP
標題Re: [問題] 程式為什麼要分區段?
時間Sun Oct 25 21:42:36 2015
不是很確定你要問的是 elf 裡頭的 segment 還是 section。
如果是指載入程式到記憶體時的 segment,
那大概有一些目的。
若是類似變數存取的這種放在同一個記憶體區域,
就可以針對這些東西做某種設定。
例如將這個區域的記憶體屬性設定成唯讀, 這樣就做到了
唯讀變數的設定。
若是類似執行的部份放在同一塊區域, 可以設定成只能執行,
這樣要做修改程式碼的動作就會出錯。
不過若是沒有 mmu 來支援這些功能, 就不會有這樣的分別了。
bss 這塊記憶體位址, 在 c runtime 執行的時候便會用 0 來初始化這塊
記憶體, 其實我不知道有什麼功用, 因為沒有這麼做的話,自己的程式碼
也可以這麼做, 無損程式的撰寫。你也可以寫出不用到 bss 的程式,
不過你用的 c library 可就難以保證了。
這個問題真的困難, 我只是「略懂」, 希望能解除你一點疑惑。
我其實不確定和 cache 有沒關係, 因為不分這些區域, 只要
這些程式碼都在「附近」, 一樣可以受到 cache 的庇祐。
※ 引述《soga0806 (巴歐薩給路嘎)》之銘言:
: 小弟有點菜
: 只知道一個程式的包含很多區段
: Ex: stack heap text data bss
: 也大概知道各個區段存放的東西(除了bss不太懂)
: 想問的是為什麼要分出這些區段呢?
: 謝謝大大!
--
要有一流的運氣, 才能邂逅一流的美女。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.212.15
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1445780563.A.FFC.html
推 soga0806: 真的十分感謝你!有解答到我的一些疑惑! 10/25 21:53
推 littleshan: 因為bss是初始化為0,所以執行檔中只需記錄大小 10/26 01:52
→ littleshan: 不需要真的放一塊都是0的資料在.data裡面 10/26 01:53
→ littleshan: 這可以大幅縮小執行檔大小與載入時間 10/26 01:53
→ tinlans: bss 是一種最佳化,除了省去 I/O 時間,還能以 word 為單 10/26 03:12
→ tinlans: 位來填 0,效率會比較好一點。 10/26 03:13
→ tinlans: 不過做 MCU 的會超恨這機制,程式未必需要初始成 0, 10/26 03:14
→ tinlans: 但是這會造成啟動時間變長 XD 10/26 03:15
推 johnpage: 看機械碼 00的作用,就會了解 10/26 06:17
推 goliathplus: 可以宣告 NOINIT 區間阿 自己寫 LOADEER 10/28 10:57