作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1445780563.A.FFC.html
1F:推 soga0806: 真的十分感谢你!有解答到我的一些疑惑! 10/25 21:53
2F:推 littleshan: 因为bss是初始化为0,所以执行档中只需记录大小 10/26 01:52
3F:→ littleshan: 不需要真的放一块都是0的资料在.data里面 10/26 01:53
4F:→ littleshan: 这可以大幅缩小执行档大小与载入时间 10/26 01:53
5F:→ tinlans: bss 是一种最佳化,除了省去 I/O 时间,还能以 word 为单 10/26 03:12
6F:→ tinlans: 位来填 0,效率会比较好一点。 10/26 03:13
7F:→ tinlans: 不过做 MCU 的会超恨这机制,程式未必需要初始成 0, 10/26 03:14
8F:→ tinlans: 但是这会造成启动时间变长 XD 10/26 03:15
9F:推 johnpage: 看机械码 00的作用,就会了解 10/26 06:17
10F:推 goliathplus: 可以宣告 NOINIT 区间阿 自己写 LOADEER 10/28 10:57