Re: [问题] memory stack 的问题

楼主: descent (“雄辩是银,沉默是金”)   2016-08-27 23:51:58
※ 引述《kyuudonut (善良老百姓)》之铭言:
: 最近写 c code 一直想厘清一些问题
: 跟c程式没有很直接相关,若发在这不妥再请麻烦版友告知了 m(_ _)m
: 最近在研读virtual memory相关知识,大致上了解paging的运作模式
: 但仍不太懂 stack 往下长的实际情况是如何运作?
: stack就我的理解基本上是:
: 程式在执行 function call 时,堆叠便会一直往下长
: [问题一] process 是在 loading 时才知道分配到的 stack 的起始位置吗?
加载一个 执行档时, 要做一些事情, 设定这个 process sp 暂存器这是其中一件事。
: [问题二] stack overflow 如何判定? 在此 stack 的大小是由谁决定的呢?
编译器可以插入检查码, 请参考
http://descent-incoming.blogspot.tw/2013/05/gcc-fstack-protector.html
作业系统可以运用 page fault 来知道 process stack 爆了。
stack 大小由作业系统决定, 执行档格式可能也可以带这个资讯, 让作业系统参考。
: [问题二] 如果有多个 process 同时运作,各自 stack 的起始位置又是如何分配呢?
: (一直往下长不会撞到吗@@)
在 process 切换时, sp 暂存器会被存起来, 作业系统会为每个
process 规划好其 stack 使用大小, 在 context switch 时,
把 sp 指到分配好的那个 stack 区域。
看 os 设定, 可以设计成让 process stack 相互盖到,
也可以不要盖到。你一定选那种不会盖到的 os 吧
: (当某 process 需要的 stack 大小超过两个 page 又是如何维护?
: page 如果不连续怎么办?)
没研究, 但应该要连续的 page 才可以。
: [问题三] 一个程式有code, text区段,是直接从 heap 下面开始剩余内存
: 随机取一page各自加载吗?还是 memory 还有在更细分区块?
看不懂这个问题。你是要问加载执行档时, code, text segment 怎么被分配的
吗?
: 还请各位前辈指教,或是指引我关键字QQ 我会去查资料
: 小弟目前正在研读"程式设计师的自我修养-连结,加载,程式库"
: 这本书写的很详细,却又引出更多疑问 orz
你有2个问题二
作者: Eleina (艾琳娜)   2016-08-28 00:02:00
当需要的 stack 大小超过两个 page... 看到 seg fault 改stack size 不是吗 XD
作者: kyuudonut (善良老百姓)   2016-08-28 17:37:00
谢谢前辈回文回复我的问题,以下是我的理解:所以OS会替各个process分配好其stack之大小与起始位置,以避免process各自盖到,如果超过大小即stackoverflow.另外我的问题三是指,OS是否还会在内存另外划分code,data的内存区段, 等process需要加载时,再从上面的ssection各自取page加载process的code, data section?
作者: askacis (ASKA)   2016-08-28 20:14:00
Linux 下可以打pmap [pid]观察各Section
作者: kyuudonut (善良老百姓)   2016-08-30 14:50:00
前辈您好,最近我也在Taiwan Linux Kernel Hackers所举办的读书会刚好也是选用这本书想请问这本书的操作需要购买额外的硬件还是有模拟器可以操作呢?抱歉...我看错了,不是同一本

Links booklink

Contact Us: admin [ a t ] ucptt.com