Почему в реализации копии ядра Linux используется флаг A C? - PullRequest
3 голосов
/ 07 марта 2020

Реализация 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 используются в рутине? Каковы будут последствия, если мы просто удалим их?

1 Ответ

7 голосов
/ 07 марта 2020

Обычно все проверки доступа к странице отключены в режиме супервизора, и ядро ​​может читать или записывать любую страницу независимо от того, доступна ли она только для чтения или помечена как страница супервизора или пользователя. Однако, если Защита доступа в режиме супервизора включена (CR4.SMAP = 1), то флаг A C определяет, может ли ядро ​​читать или записывать страницы пользовательского режима. Если EFLAGS.A C равен 0, то чтение или запись на страницы пользовательского режима вызовут исключение сбоя страницы. Если EFLAGS.A C равен 1, то ядру разрешено читать и записывать страницы пользовательского режима.

Изобретены инструкции STA C и CLA C, чтобы обеспечить быструю и простую смену A C флаг в коде, как в вашем примере. При настройке EFLAGS.A C команде REP MOVSB ​​разрешен доступ к страницам пользовательского режима. После очистки EFLAGS.A C в конце ядро ​​снова защищается от случайного доступа в пользовательском режиме, который может быть использован вредоносным кодом.

...