深入浅出计算机组成原理
徐文浩
bothub 创始人
70432 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

41 | 理解内存(下):解析TLB和内存保护

密码哈希值加盐
随机化内存空间的分配
SQL注入攻击
PHP中禁止eval函数的执行权限
指令部分设置成“可执行”的
地址空间布局随机化
可执行空间保护
MMU
DTLB
ITLB
TLB
多级页表
页表
内存保护策略在日常开发中的应用
其他内存保护策略
Wikipedia
Spectre和Meltdown漏洞
内存保护
加速地址转换:TLB
地址转换
课后思考
推荐阅读
内存安全问题
性能问题
内存保护措施

该思维导图由 AI 生成,仅供参考

机器指令里面的内存地址都是虚拟内存地址。程序里面的每一个进程,都有一个属于自己的虚拟内存地址空间。我们可以通过地址转换来获得最终的实际物理地址。我们每一个指令都存放在内存里面,每一条数据都存放在内存里面。因此,“地址转换”是一个非常高频的动作,“地址转换”的性能就变得至关重要了。这就是我们今天要讲的第一个问题,也就是性能问题
因为我们的指令、数据都存放在内存里面,这里就会遇到我们今天要谈的第二个问题,也就是内存安全问题。如果被人修改了内存里面的内容,我们的 CPU 就可能会去执行我们计划之外的指令。这个指令可能是破坏我们服务器里面的数据,也可能是被人获取到服务器里面的敏感信息。
现代的 CPU 和操作系统,会通过什么样的方式来解决这两个问题呢?别着急,等讲完今天的内容,你就知道答案了。

加速地址转换:TLB

上一节我们说了,从虚拟内存地址到物理内存地址的转换,我们通过页表这个数据结构来处理。为了节约页表的内存存储空间,我们会使用多级页表数据结构。
不过,多级页表虽然节约了我们的存储空间,但是却带来了时间上的开销,变成了一个“以时间换空间”的策略。原本我们进行一次地址转换,只需要访问一次内存就能找到物理页号,算出物理内存地址。但是用了 4 级页表,我们就需要访问 4 次内存,才能找到物理页号。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了现代计算机中的内存保护和性能优化问题。首先讨论了内存地址转换的性能问题,指出了多级页表结构带来的时间开销,并介绍了TLB的作用,通过缓存已经进行过地址转换的查询结果来加速地址转换过程。其次,文章讨论了内存保护和安全性的问题,介绍了可执行空间保护机制,通过对进程内存空间的执行权限进行控制,防止非指令区域的内容被当作指令执行,从而提高系统的安全性。文章还举了PHP开发中禁止eval函数执行权限和SQL注入攻击的例子,强调了内存保护的重要性。此外,还介绍了地址空间布局随机化的安全机制,通过随机化内存空间的分配,避免让一个进程的内存里面的代码被推测出来,从而不容易被攻击。总的来说,本文深入浅出地介绍了内存保护和性能优化的相关概念,对于读者快速了解这两个问题具有很好的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 焰火
    地址空间布局随机化。虽然进程里的段乱序了,但是他的虚拟地址和乱序前没有改变吧,只是又多了一层地址转换而已?这样理解对么?

    作者回复: 焰火同学, 你好,不是的。虚拟内存空间的布局发生变化了。因为如果通过程序或者系统漏洞往进程里面注入代码,针对改写的也是虚拟内存地址,所以虚拟内存地址的布局是发生了变化的。而不是虚拟到物理之间多做一层转化,因为物理内存地址的分配本来就不是固定的,相当于已经随机化过了。

    2019-09-20
    2
    20
  • zaab
    想通了一个问题: 你知道sql里面不用sql拼接 而使用占位符可以防止sql注入攻击吧 那么为什么使用占位符可以防止攻击呢 我没想明白。 简单来说就是将占位符当成数据解析 而不当作指令解析, 不管这个占位符给得什么 我都把它当成是数据 而不会是指令
    2019-10-12
    2
    45
  • 雷刚
    1. 简单页表:类似数组,时间复杂度为 O(1)。但空间复杂度为数组的长度,即页的个数。32 位的内存地址为 4MB(= 2^20 * 4byte)。 2. 多级页表:类似 B+ 树,时间复杂度为 O(n),如 4 级页表就需要查询 4 次。但程序只需要存储正在使用的虚拟页的映射关系,空间复杂度大大降低。 3. TLB:使用缓存保存之前虚拟页的映射关系。因为指令和数据往往都是连续的,存在空间局部性和时间局部性。也就是说,连续执行的多个指令和数据往往在同一个虚拟页中,没必要每次都从内存中读取页表来解析虚拟地址。
    2020-03-29
    10
  • 免费的人
    linux下 内存空间随机化是否开启 是有配置的吗 还是跟内核版本有关?
    2019-07-29
    1
    7
  • 宇宙超人
    问个问题 cpu.缓存和mmu是怎么个顺序 先mmu转换地址 然后去cache看命中还是反过来
    2020-05-02
    1
    4
  • 拓山
    如果是这个salt是保存在db中,这个随机化策略只是增加了黑客的破解成本,并非完全安全。 一个解决方案是将一个从密码机生成的秘钥通过算法将其生成为一个安全图片,同时提供一个sdk来封装对安全图片的读取,并提供加解密方法。 业务方每次加解密时,调用sdk来做加解密,这样秘钥就不会落盘,不会有日志记录。安全性得到极大提升
    2019-10-24
    3
    4
  • 排骨
    局部性原理无处不在啊
    2022-07-10
    3
  • linker
    还有使用哨兵进行堆栈溢出检测等
    2020-03-08
    2
  • 不一样的烟火
    地址随机化后不再局部 是不是牺牲了效率
    2019-10-20
    2
  • xta0
    问一下,对于使用salt加密的策略,salt是需要存入数据库的吧?这样当用户登录时,先取出salt,然后重新计算hash值进行比对?
    2019-07-29
    6
    2
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部