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

Обновите initramfs, как указано в руководстве, скопировав mdadm.conf в папку /etc/update-initramfs/etc (не проверено, возможно, это должна быть подпапка mdadm).

35
20.01.2017, 04:38
3 ответа

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

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

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

37
27.01.2020, 19:36

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

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

17
27.01.2020, 19:36

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

-3
27.01.2020, 19:36

Теги

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