※ 引述《kyuudonut (善良老百姓)》之铭言:
: 最近在研读virtual memory相关知识,大致上了解paging的运作模式
: [问题二] 如果有多个 process 同时运作,各自 stack 的起始位置又是如何分配呢?
: (一直往下长不会撞到吗@@)
: (当某 process 需要的 stack 大小超过两个 page 又是如何维护?
: page 如果不连续怎么办?)
你既然是在读 virtual memeory,应该知道每个 process 都有自己一块虚拟位址空间。
以 32-bit 系统来说,就是每个 process 各自有 4GB 的寻址空间。
这 4GB 的寻址空间,再细一点的分法是再区分成 user space 跟 kernel space。
默认的状况下,Windows 是 2GB/2GB,Linux 则是 3GB/1GB。
有些人在 32-bit 的 XP 插了很大内存的显示卡,结果内存剩下 2.xx GB,
原因就是这样来的,因为 kernel space 要划一块去映射,细节要问熟微软系统的。
stack 和 heap 这些东西都在 user space,user space 是各 process 之间独立的。
换句话说对每个 32-bit Linux process 而言,那 3GB 里不会有其它 process 的资料。
所以没有什么撞到的问题,两个平行世界的东西你要怎么让它们相撞?
如果要 programmer 去担心这种事,那 virtual memory 存在的意义就没有了。
你没特别设定的话,同个编译系统生出来的执行档,在同个 OS 执行,
每个 process 的 stack 起始位址都是一模一样的,当然这不会是实体位址。
stack 的 page 当然是连续的。
在每个 process 各自独立的虚拟 3GB 寻址空间里,有什么理由划不出连续空间?
你 C 程式里 pointer 看到的内存位址都是这些虚拟位址,并不是实体的。
至于这些 page 怎么对应到实体内存的 frame,我想书上应该都写得很清楚了。