Почему номера системных вызовов Linux в x86 и x86_64 различаются?

Я знаю, что интерфейс системного вызова реализован на низком уровне и, следовательно, зависит от архитектуры / платформы, а не от «общего» кода.

Тем не менее, я не могу четко видеть причину, по которой системные вызовы в Linux 32-разрядные ядра x86 имеют номера, которые не сохраняются одинаково в аналогичной архитектуре Linux 64-bit x86_64? Какова мотивация / причина этого решения?

Мое первое предположение заключалось в том, что причиной предпосылки было сохранение 32-разрядных приложений в системе x86_64, так что благодаря разумному смещению к номеру системного вызова система будет знать, что пользовательское пространство представляет собой 32-разрядную или 64-разрядную соответственно. Однако это не так. По крайней мере, мне кажется, что read () – системный номер вызова 0 в x86_64 не может быть выровнен с этой мыслью.

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

Будучи неосведомленными к задачам реализации зависимых от архитектуры частей кода, я все еще задаюсь вопросом, как изменить номера системных вызовов , когда нет никакой необходимости (поскольку даже 16-разрядный регистр будет хранить в значительной степени больше, чем в настоящее время ~ 346 номеров для представления всех звонки), поможет достичь чего-либо, кроме нарушения совместимости (хотя использование системных вызовов через библиотеку, libc, смягчает ее).

3 Solutions collect form web for “Почему номера системных вызовов Linux в x86 и x86_64 различаются?”

Что касается аргументов за конкретную нумерацию, которая не соответствует какой-либо другой архитектуре [кроме «x32», которая действительно является частью архитектуры x86_64]: в самые ранние дни поддержки x86_64 в ядре Linux до того, как были какие-либо серьезные обратные ограничения совместимости, все системные вызовы были перенумерованы, чтобы оптимизировать их на уровне использования кешлайн .

Я не знаю достаточно о развитии ядра, чтобы узнать конкретную основу для этих вариантов, но, видимо, существует определенная логика выбора, чтобы перенумеровать все с этими конкретными числами, а не просто копировать список из существующей архитектуры и удалить неиспользуемые. Похоже, что порядок может основываться на том, как обычно они называются – например, чтение / запись / открытие / закрытие вверх. Выход и вилка могут казаться «фундаментальными», но каждый из них называется только один раз за процесс.

Возможно, что-то происходит и в отношении системных вызовов, которые обычно используются вместе в одной и той же строке кэша (эти значения являются целыми числами, но в ядре есть таблица с указателями функций для каждой из них, поэтому каждая группа из 8 системных вызовов занимает 64-байтная строка кэша для этой таблицы)

См. Этот ответ на вопрос «Почему разные номера системных вызовов в amd64 linux?» на переполнение стека.

Подводя итог: ради совместимости список системных вызовов стабилен и может только расти. Когда появилась архитектура x86 64, ABI (передача аргументов, возвращаемое значение) была другой, поэтому разработчики ядра воспользовались возможностью, чтобы принести давно ожидаемые изменения.

Короче говоря, потому что кто-то думал, что « N+1 безвозмездно несовместимые способы сделать это лучше, чем N способов». Для исторических арков номера системных вызовов обычно выбирались в соответствии с некоторыми устаревшими запатентованными unix. Но для x86_64 разработчики ядра могли выбирать любую нумерацию, которая им нравилась. Вместо того, чтобы делать простой выбор и повторно использовать существующую нумерацию, они сделали выбор, чтобы изобрести новый стандарт. Затем они сделали это снова для aarch64 и кучу других. Это часто повторяющийся шаблон в разработке ядра Linux.

  • Библиотека совместимости FreeBSD и GNU / Linux
  • Неожиданный родительский идентификатор процесса на выходе
  • Программа Strace Hello World
  • Прерывание системных вызовов при попадании сигнала
  • Таблица или список режимов отказа системного вызова?
  • Как ядро ​​Linux знает, какой процесс вызвал системный вызов?
  • Что означает «системный вызов», если не реализация на языке программирования?
  • Команда для отслеживания rsh-сервера для проверки поведения конкретного системного вызова
  • Вызывают ли системные вызовы сами?
  • Документация по устройству Mapper ioctls?
  • Когда новый системный вызов добавляется в Linux?
  • Linux и Unix - лучшая ОС в мире.