41 | 理解内存(下):解析TLB和内存保护
徐文浩
该思维导图由 AI 生成,仅供参考
机器指令里面的内存地址都是虚拟内存地址。程序里面的每一个进程,都有一个属于自己的虚拟内存地址空间。我们可以通过地址转换来获得最终的实际物理地址。我们每一个指令都存放在内存里面,每一条数据都存放在内存里面。因此,“地址转换”是一个非常高频的动作,“地址转换”的性能就变得至关重要了。这就是我们今天要讲的第一个问题,也就是性能问题。
因为我们的指令、数据都存放在内存里面,这里就会遇到我们今天要谈的第二个问题,也就是内存安全问题。如果被人修改了内存里面的内容,我们的 CPU 就可能会去执行我们计划之外的指令。这个指令可能是破坏我们服务器里面的数据,也可能是被人获取到服务器里面的敏感信息。
现代的 CPU 和操作系统,会通过什么样的方式来解决这两个问题呢?别着急,等讲完今天的内容,你就知道答案了。
加速地址转换:TLB
上一节我们说了,从虚拟内存地址到物理内存地址的转换,我们通过页表这个数据结构来处理。为了节约页表的内存存储空间,我们会使用多级页表数据结构。
不过,多级页表虽然节约了我们的存储空间,但是却带来了时间上的开销,变成了一个“以时间换空间”的策略。原本我们进行一次地址转换,只需要访问一次内存就能找到物理页号,算出物理内存地址。但是用了 4 级页表,我们就需要访问 4 次内存,才能找到物理页号。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了现代计算机中的内存保护和性能优化问题。首先讨论了内存地址转换的性能问题,指出了多级页表结构带来的时间开销,并介绍了TLB的作用,通过缓存已经进行过地址转换的查询结果来加速地址转换过程。其次,文章讨论了内存保护和安全性的问题,介绍了可执行空间保护机制,通过对进程内存空间的执行权限进行控制,防止非指令区域的内容被当作指令执行,从而提高系统的安全性。文章还举了PHP开发中禁止eval函数执行权限和SQL注入攻击的例子,强调了内存保护的重要性。此外,还介绍了地址空间布局随机化的安全机制,通过随机化内存空间的分配,避免让一个进程的内存里面的代码被推测出来,从而不容易被攻击。总的来说,本文深入浅出地介绍了内存保护和性能优化的相关概念,对于读者快速了解这两个问题具有很好的指导意义。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》,新⼈⾸单¥68
《深入浅出计算机组成原理》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(18)
- 最新
- 精选
- 焰火地址空间布局随机化。虽然进程里的段乱序了,但是他的虚拟地址和乱序前没有改变吧,只是又多了一层地址转换而已?这样理解对么?
作者回复: 焰火同学, 你好,不是的。虚拟内存空间的布局发生变化了。因为如果通过程序或者系统漏洞往进程里面注入代码,针对改写的也是虚拟内存地址,所以虚拟内存地址的布局是发生了变化的。而不是虚拟到物理之间多做一层转化,因为物理内存地址的分配本来就不是固定的,相当于已经随机化过了。
2019-09-20220 - zaab想通了一个问题: 你知道sql里面不用sql拼接 而使用占位符可以防止sql注入攻击吧 那么为什么使用占位符可以防止攻击呢 我没想明白。 简单来说就是将占位符当成数据解析 而不当作指令解析, 不管这个占位符给得什么 我都把它当成是数据 而不会是指令2019-10-12245
- 雷刚1. 简单页表:类似数组,时间复杂度为 O(1)。但空间复杂度为数组的长度,即页的个数。32 位的内存地址为 4MB(= 2^20 * 4byte)。 2. 多级页表:类似 B+ 树,时间复杂度为 O(n),如 4 级页表就需要查询 4 次。但程序只需要存储正在使用的虚拟页的映射关系,空间复杂度大大降低。 3. TLB:使用缓存保存之前虚拟页的映射关系。因为指令和数据往往都是连续的,存在空间局部性和时间局部性。也就是说,连续执行的多个指令和数据往往在同一个虚拟页中,没必要每次都从内存中读取页表来解析虚拟地址。2020-03-2910
- 免费的人linux下 内存空间随机化是否开启 是有配置的吗 还是跟内核版本有关?2019-07-2917
- 宇宙超人问个问题 cpu.缓存和mmu是怎么个顺序 先mmu转换地址 然后去cache看命中还是反过来2020-05-0214
- 拓山如果是这个salt是保存在db中,这个随机化策略只是增加了黑客的破解成本,并非完全安全。 一个解决方案是将一个从密码机生成的秘钥通过算法将其生成为一个安全图片,同时提供一个sdk来封装对安全图片的读取,并提供加解密方法。 业务方每次加解密时,调用sdk来做加解密,这样秘钥就不会落盘,不会有日志记录。安全性得到极大提升2019-10-2434
- 排骨局部性原理无处不在啊2022-07-103
- linker还有使用哨兵进行堆栈溢出检测等2020-03-082
- 不一样的烟火地址随机化后不再局部 是不是牺牲了效率2019-10-202
- xta0问一下,对于使用salt加密的策略,salt是需要存入数据库的吧?这样当用户登录时,先取出salt,然后重新计算hash值进行比对?2019-07-2962
收起评论