gpt4 book ai didi

linux - 为什么 Linux 内核复制实现使用 Acflags?

转载 作者:行者123 更新时间:2023-12-01 09:40:49 28 4
gpt4 key购买 nike

copy_user_enhanced_fast_string 的实现在 Linux 内核复制例程中使用 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都用在日常?如果我们简单地删除它们会产生什么后果?

最佳答案

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

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

关于linux - 为什么 Linux 内核复制实现使用 Acflags?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60578975/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com