Скам и безопасность

Конвенции для расширяемых системных вызовов в Linux: эволюция и перспективы

Скам и безопасность
Conventions for Extensible System Calls(2020)

Обзор современных конвенций и механизмов расширения системных вызовов в ядре Linux, обсуждаемых на конференции Linux Plumbers 2020. Технологии совместимости, проблемы и примеры применения расширяемых структур в системных вызовах для повышения гибкости и устойчивости API.

Современное развитие операционной системы Linux неразрывно связано с постоянным совершенствованием и расширением функциональности ядра. Одним из краеугольных камней этого процесса являются системные вызовы — интерфейс между пользовательским пространством и ядром, обеспечивающий доступ к ресурсам и сервисам операционной системы. За годы эволюции ядра Linux было введено множество системных вызовов, однако возникла фундаментальная проблема: как обеспечить их расширяемость и гибкость для поддержки новых функций без создания множества малозначительных, часто дублирующих друг друга, вызовов? Эта проблема стала предметом активного обсуждения сообщества, особенно на конференции Linux Plumbers 2020, где ведущие разработчики, такие как Кристиан Браунер и Алекса Сараи, представили современные взгляды и практики в области проектирования расширяемых системных вызовов. Одним из ключевых наблюдений стало повторяющееся явление, когда для решения новых задач разработчики создавали отдельные системные вызовы вместо расширения существующих. Примером стала история работы с переименованием файлов в Linux: начиная с простого rename(), затем появился renameat(), а позже и renameat2().

Каждый новый вызов был вызван необходимостью поддержки функций, которые не вписывались в старый интерфейс. Такой подход, помимо усложнения пользовательского пространства, приводит к раздробленности и трудностям с поддержкой различных версий ядра. В рамках обсуждений было выделено два традиционных пути расширения системных вызовов. Первый — использование мультиплексоров, когда один системный вызов выполняет несколько функций, определяемых специальным параметром. Второй — создание множества специализированных вызовов, каждый из которых реализует отдельную функцию.

Оба подхода имеют свои минусы: мультиплексоры затрудняют поддержку и усложняют библиотеки, а множественные вызовы приводят к дополнительной нагрузке на пользователя и разработчиков. Для решения этих проблем предложена концепция "расширяемых структур" (extensible structs), уже реализованная, например, в системном вызове openat2(). Суть метода заключается в том, что параметры системного вызова инкапсулируются в одной структуре, указатель на которую и её размер передаются в ядро. Размер структуры выступает в роли своеобразной версии, позволяющей ядру определить, какие поля доступны и должны быть обработаны. Такой подход обеспечивает двустороннюю совместимость: если пользовательское пространство передает структуру меньшего размера, ядро интерпретирует её как старую версию, заполняя отсутствующие поля нулями и сохраняя старое поведение.

Если ядро старое, а пользовательское пространство передало более крупную структуру, ядро проверит дополнительные поля, и если они не равны нулю, вызов завершится ошибкой, сигнализируя о неподдерживаемых функциях. Таким образом обеспечивается плавный переход и совместимость как для старых, так и для новых версий системного вызова. Обсуждения также затрагивали типизацию параметра flags, при этом предпочтение отдавалось unsigned int из-за его поведения при расширении знака, что может вызвать непредвиденные эффекты при использовании знаковых типов. Важно, что конвенции требуют от системных вызовов базовой возможности расширения, чтобы избежать необходимости введения новых вызовов ради поддержки дополнений. Однако расширяемые структуры не решают другой важный вопрос — как пользовательскому пространству узнавать, какие именно функции поддерживаются на текущем ядре.

Текущая практика требует проб и ошибок с обходом вызовов при недоступности новых функций, что дорого и неудобно. Одна из предложенных идей — введение отдельного системного вызова, который позволил бы запрашивать поддерживаемые ядром функции конкретного системного вызова. Архитектура такого вызова предполагает передачу номера системного вызова и битовой карты флагов, в которой каждое битовое поле соответствует отдельной функции или расширению. Таким образом, пользовательское пространство может эффективно узнать, какие функции доступны, без необходимости избыточных проверок и резервного копирования. Кроме того, обсуждалась возможность внедрения noop-флага в существующие вызовы, позволяющего «опрашивать» ядро без выполнения каких-либо действий, но данный подход рассматривался как своего рода мультиплексор, что противоречит основной идеологии новых рекомендаций.

Поэтому поклонники простоты склоняются к выделению отдельного системного вызова для определения возможностей, что облегчает поддержку и разработку устойчивого пользовательского ПО. Важным техническим аспектом является безопасность. Некоторые участники обсуждений подняли вопрос об инспекции указателей, встраиваемых в структуры параметров, особенно при использовании механизмов безопасности, таких как seccomp. В настоящее время фильтры seccomp не способны полноценно анализировать содержимое структур с указателями, что создает сложности для безопасного контроля вызовов. Однако исследователи и разработчики работают над расширением возможностей seccomp для поддержки таких сценариев, включая создание копий структур с последующей проверкой до передачи параметров в ядро.

Также обсуждался вопрос о том, почему размер структуры передается как отдельный параметр, а не хранится внутри самой структуры. Сторонники отдельного параметра аргументируют это тем, что в случае, когда структура переходит через различные слои пользовательского пространства, размер может изменяться, и выделенный параметр помогает избежать ошибок и атак, связанных с некорректным определением длины структуры. Важным итогом дискуссий стало общее согласие, что в будущем необходимо категорически отказаться от мультиплексорных системных вызовов, поскольку они усложняют реализацию в пользовательском пространстве, создают проблемы для библиотек и повышают вероятность ошибок. Вместо этого приемлемыми считаются вызовы с базовой возможностью расширения через флаги и структурированные параметры. Для развития и внедрения этих конвенций на уровне ядра планируется обновить официальную документацию, что позволит разработчикам ориентироваться на эти лучшие практики при создании новых системных вызовов.

Автоматическая торговля на криптовалютных биржах Покупайте и продавайте криптовалюты по лучшим курсам Privatejetfinder.com (RU)

Далее
SQLite per User Database Creation with Turso [video]
Суббота, 04 Октябрь 2025 Создание отдельных SQLite баз данных для каждого пользователя с Turso: Новый уровень масштабируемости и производительности

Подробное руководство по созданию индивидуальных SQLite баз данных для каждого пользователя с использованием Turso. В статье рассматриваются преимущества, особенности и практические рекомендации по внедрению этой технологии для оптимизации хранения данных и улучшения пользовательского опыта.

France and Switzerland shut down nuclear power plants amid scorching heatwave
Суббота, 04 Октябрь 2025 Как жара в Европе заставила Францию и Швейцарию приостановить работу ядерных электростанций

Жаркая волна в Европе вызвала неожиданные проблемы для ядерной энергетики во Франции и Швейцарии, где несколько электростанций были вынуждены снизить мощности или временно закрыться из-за перегрева водных ресурсов, необходимых для охлаждения. Последствия этого явления и перспективы энергетики в условиях меняющегося климата становятся ключевыми вопросами современности.

Asia Morning Briefing: SOL up 4% as Analysts Say Staking ETF (SSK) Has Strong Launch
Суббота, 04 Октябрь 2025 Резкий рост Solana и успешный запуск Staking ETF: Новая эра инвестиций в криптовалюты

Рост цены Solana на фоне запуска первого в США крипто-стейкинг ETF отражает важные сдвиги на рынке цифровых активов и законодательные изменения, открывающие новые возможности для инвесторов.

 Crypto billionaire bit off kidnapper’s finger during ambush: Report
Суббота, 04 Октябрь 2025 Криптобогач из Австралии откусил палец похитителю в ходе дерзкого нападения в Эстонии

История о том, как австралийский криптобогач Тим Хит смог спастись от похищения, откусив палец нападавшему. Инцидент произошёл в Эстонии и стал ярким примером опасностей, с которыми сталкиваются фигуры криптоиндустрии в современном мире.

Whole-genome ancestry of an Old Kingdom Egyptian
Суббота, 04 Октябрь 2025 Геном древнего египтянина: новая эра в исследовании происхождения и истории Древнего царства

Раскрыты уникальные данные о геномном составе одного из первых жителей Древнего Египта эпохи Старого царства, что изменяет представления о миграциях и межрегиональных связях в древности.

Show HN: I made an MCP Server for Whois and RDAP
Суббота, 04 Октябрь 2025 Современный сервер MCP для Whois и RDAP: инновационное решение для проверки доменов и IP-адресов

Узнайте о новейшем сервере MCP, который объединяет возможности традиционных Whois и современных RDAP протоколов для эффективной и быстрой проверки доменных имен и IP-адресов. Погрузитесь в технологии, архитектуру и преимущества решения с поддержкой асинхронных операций, умного кэширования и масштабируемого rate limiting.

European summers are getting brutally hot. So why is air conditioning so rare?
Суббота, 04 Октябрь 2025 Жаркое лето в Европе: почему кондиционеры встречаются так редко?

Европейские лета становятся всё более знойными и опасными для здоровья, но кондиционеры в домах по-прежнему редкость. Рассмотрены причины низкой популярности охлаждающих систем, культурные особенности, экономические факторы и современные вызовы климатического кризиса.