Почему «новый» системный вызов быстрее, чем системный вызов «interupt»?

Я в любом случае не знаю, как напрямую сделать то, что вы просите, и вы, конечно, столкнулись бы с проблемами, если бы file1существовал как в folder1, так и в folder2.

Вы можете создавать ссылки из каждого файла/каталога в folder2на folder1, для этого потребуется ссылка на файл/каталог в folder2. Вы можете создать скрипт для обновления ссылок и удаления мертвых ссылок.

Если бы вы использовали жесткие ссылки, то все это было бы без проблем при выполнении списка каталогов и т. д.

Затем вы можете использовать inotify, чтобы просмотреть folder1и folder2, чтобы инициировать создание/удаление жестких ссылок.

0
03.05.2020, 15:59
1 ответ

Они быстрее, потому что у них гораздо меньше работы, и потому что им не нужно читать из памяти.

Когда вы используете программное прерывание для выполнения системного вызова, ЦП не знает, что вы делаете именно это. Ему необходимо прочитать целевые значения CS и EIP из таблицы дескрипторов прерываний. Значение CS определяет целевой уровень привилегий; как только ЦП выясняет это, ему необходимо определить целевое состояние, что требует большего чтения из памяти.

SYSCALL, с другой стороны, полностью основан на регистрах; целевой уровень привилегий известен заранее, а целевое состояние определяется MSR, установленными ядром.

Разница в скорости невелика по сравнению с длительностью некоторых системных вызовов, но есть много быстрых системных вызовов. Конечно, весь бизнес KPTI означает, что все системные вызовы медленные, но прирост скорости от SYSCALLвсе же стоит того.

5
28.04.2021, 23:16

Теги

Похожие вопросы