Intereting Posts
Есть ли файл, который я могу редактировать, чтобы изменить привязки клавиш Просвещения 19? Как эхо анализирует $ 100? Postfix, SMTP-сервер, PHPMailer Отображать все объявленные часы и их частоту rsync, удалите файлы на стороне получателя, которые были удалены на стороне отправки. (Но не удаляйте все) изменить путь кэширования кэша для APT Сценарий Bash работает через терминал, но не через главное меню При загрузке tmux по умолчанию при запуске zsh-терминала Запустите мой собственный HTTP-браузер с быстрой прорисовкой a la Opera Mini? Как разрешить 'netlink: осталось 12 байтов после разбора атрибутов.' в syslog на Red Hat Enterprise Linux 6.5? rsync –del или –delete Почему это регулярное выражение perl не фиксирует обратную ссылку? Информация о группе не указана для конкретного пользователя Что это означает, когда код выполняется в режиме ? Скопировать файлы вставки в LibreOffice Writer не работает с рабочего стола Xfce

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

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

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

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

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

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

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

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

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

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

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

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