linux - 为什么 Linux Kernel copy 实现使用 AC 标志?
问题描述
copy_user_enhanced_fast_string
Linux Kernel 复制例程中的实现在 Epilog 和 prolog 中使用stac
/ 。显示以下代码:clac
perf annotate
stac
cmp $0x40,%edx
jb 0xffffffff91281f5c
mov %edx,%ecx
rep movsb %ds:(%rsi),%es:(%rdi)
xor %eax,%eax
clac
retq
AC
是“对齐检查(或访问控制)标志”。
例程中使用stac
/的原因是什么?clac
如果我们简单地删除它们会有什么后果?
解决方案
通常,所有页面访问检查在主管模式下都被禁用,并且内核可以读取或写入任何页面,无论其是只读的还是标记为主管或用户页面。但是,如果启用了超级用户模式访问保护(CR4.SMAP = 1),则 AC 标志控制内核是否可以读取或写入用户模式页面。如果 EFLAGS.AC 为 0,则读取或写入用户模式页面将导致页面错误异常。如果 EFLAGS.AC 为 1,则允许内核读取和写入用户模式页面。
发明了 STAC 和 CLAC 指令,以允许在代码中快速轻松地更改 AC 标志,就像您的示例一样。通过设置 EFLAGS.AC,允许 REP MOVSB 指令访问用户模式页面。通过在最后清除 EFLAGS.AC,内核再次受到保护,免受可能被恶意代码利用的意外用户模式访问。
推荐阅读
- python-3.x - 数据透视表中每个级别的小计
- python - 在远程服务器上运行 Spyder /Python
- java - 我正在研究一些java,试图制作Big Bang系列Rock Paper系列
- vb.net - 使用自定义比较器实例化继承的 SortedDictionary 的 VB.NET 语法
- html - 可调整大小的固定顶部导航菜单
- web - 每个屏幕/页面的线框
- websocket - 接收命令并将其发送回所有连接的客户端的 Websocket 服务器
- ios - Cordova build ios 没有通过,我没有收到任何错误。
- three.js - 如何在单击时从 Three.js 场景中删除组?
- rasa-nlu - rasa__nlu 如何训练实体捕捉动态值