首页 > 解决方案 > 为什么 Linux Kernel copy 实现使用 AC 标志?

问题描述

copy_user_enhanced_fast_stringLinux Kernel 复制例程中的实现在 Epilog 和 prolog 中使用stac/ 。显示以下代码:clacperf annotate

stac 
cmp  $0x40,%edx
jb   0xffffffff91281f5c
mov  %edx,%ecx
rep  movsb %ds:(%rsi),%es:(%rdi)
xor  %eax,%eax
clac
retq              

AC是“对齐检查(或访问控制)标志”。

例程中使用stac/的原因是什么?clac如果我们简单地删除它们会有什么后果?

标签: linuxassemblylinux-kernelx86systems-programming

解决方案


通常,所有页面访问检查在主管模式下都被禁用,并且内核可以读取或写入任何页面,无论其是只读的还是标记为主管或用户页面。但是,如果启用了超级用户模式访问保护(CR4.SMAP = 1),则 AC 标志控制内核是否可以读取或写入用户模式页面。如果 EFLAGS.AC 为 0,则读取或写入用户模式页面将导致页面错误异常。如果 EFLAGS.AC 为 1,则允许内核读取和写入用户模式页面。

发明了 STAC 和 CLAC 指令,以允许在代码中快速轻松地更改 AC 标志,就像您的示例一样。通过设置 EFLAGS.AC,允许 REP MOVSB 指令访问用户模式页面。通过在最后清除 EFLAGS.AC,内核再次受到保护,免受可能被恶意代码利用的意外用户模式访问。


推荐阅读