c文件内存映射后分块_Linux0.11共享内存机制

Linux操作系统设计的精妙之处简直让人赞叹不已,不得不佩服Linus这个天才!

共享内存也是一种节约内存使用、减小系统硬件开销的机制,他基于写时复制。

设想这样一个场景:一个可执行文件x.bin被加载到内存中以进程A的形式首次运行,由于某些原因x.bin只是部分被加载,剩下的部分还在硬盘里。当执行到逻辑地址address时由于缺页,引发缺页异常,剩下的部分从硬盘被加载到内存中,进程A得以继续运行。

在A还没退出时,shell再次执行了x.bin,此时x.bin以进程B的形式运行,同样还是运行到逻辑地址address发生了缺页异常,这次异常处理函数首先发现竟然还有A进程也在运行x.bin,于是去查找A的进程空间里面有没有B缺少的页面,结果找到了,于是直接将这一页映射到B的页表项中,B又可以继续运行。

以上就是共享内存的过程,可以看到共享内存发生在缺页的时候。

cb36987f2f43c6e7e4bc27ae1d5c251c.png

mm/memory.c

如果进程中还未加载任何可执行文件或者缺页发生在可执行文件数据段以外(这里数据段指的是可执行文件中的数据段,是静态的,包括了代码段和数据段)比如用户堆栈,则重新申请一块空闲页面并映射到线性地址address处。

如果是在数据段内发生了缺页则进行内存共享。

b67b9cbd7037cb38243f8b26ff552d09.png

mm/memory.c

如果共享内存失败则申请一个空闲页面,并把所缺页面从磁盘中读入刚申请的页面,把新页面映射到address处然后继续执行。这就是整个的缺页异常处理流程。

他首先是去尝试共享,共享不成功就从磁盘中读,不失为一种高效的方法!

035ba802d1b38ac0f32256a38d169487.png

mm/memory.c

share_page函数在尝试共享之前要检查当前进程是否满足共享的要求,即有另一个进程也在运行同一个可执行文件。如果条件满足就去执行try_to_share这个真正的共享操作。

1278ba0320f6496f10fc641e8a2dce51.png

mm/memory.c

try_to_share接受两个参数,address相对于code_start的偏移,也就是发生缺页的地方,p是可以提供共享的进程。

30f152c639abc8742972e6d1d6f65f25.png

mm/memory.c

检查目标进程对应的页面是否适合共享,如果页面已脏或者超出用户内存范围则退出。

1c83a320aa22b8becf0372b551a41ea6.png

mm/memory.c

最后将共享页面设置为只读,将共享页面保护起来,将共享页面映射到缺页地址处,并且将共享页面的引用数+1。共享完成,如果发生对共享页面的写操作,那就是写时复制了,前面已经介绍过。

3f120ab2e01d44d52a4de1e657d6bf08.gif

- End -

ab6385179b31bc31760960dbcaddc1ac.png

看雪ID:极目楚天舒               

https://bbs.pediy.com/user-741085.htm

本文由看雪论坛 极目楚天舒 原创

转载请注明来自看雪社区

c83a7af32d446269f0bded7b218321ef.gif

热门图书推荐:

5c62f9732c184536a3dd0f4470eb9f7b.png立即购买!

dbfb4a44e054511bcb6b02f581160019.png

征题正在火热进行中!

(晋级赛Q1即将于3月10日开启,敬请期待!)

推荐阅读


bf42638b18d14112f0147f5cafc00eb8.png


3e325456b0e5652e7822460697a98754.png


45ed51e4f466c511bf2213a520696051.png


edd7f43b6f61789e791355f44bee7dd9.png


7825433aa99daba9ee69d9071ca4ddd0.png

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

点击下方“阅读原文”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值