-
-
[原创]Linux0.11共享内存机制
-
发表于:
2019-1-14 20:17
7363
-
Linux操作系统设计的精妙之处简直让人赞叹不已,不得不佩服Linus这个天才!
共享内存也是一种节约内存使用、减小系统硬件开销的机制,他基于写时复制。
设想这样一个场景:一个可执行文件x.bin被加载到内存中以进程A的形式首次运行,由于某些原因x.bin只是部分被加载,剩下的部分还在硬盘里。当执行到逻辑地址address时由于缺页,引发缺页异常,剩下的部分从硬盘被加载到内存中,进程A得以继续运行。在A还没退出时,shell再次执行了x.bin,此时x.bin以进程B的形式运行,同样还是运行到逻辑地址address发生了缺页异常,这次异常处理函数首先发现竟然还有A进程也在运行x.bin,于是去查找A的进程空间里面有没有B缺少的页面,结果找到了,于是直接将这一页映射到B的页表项中,B又可以继续运行。
以上就是共享内存的过程,可以看到共享内存发生在缺页的时候。
mm/memory.c
如果进程中还未加载任何可执行文件或者缺页发生在可执行文件数据段以外(这里数据段指的是可执行文件中的数据段,是静态的,包括了代码段和数据段)比如用户堆栈,则重新申请一块空闲页面并映射到线性地址address处。
如果是在数据段内发生了缺页则进行内存共享。
如果共享内存失败则申请一个空闲页面,并把所缺页面从磁盘中读入刚申请的页面,把新页面映射到address处然后继续执行。这就是整个的缺页异常处理流程。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)