Мой вопрос заключается в том, почему в настоящее время некоторая обработка событий операционной системы все еще пишется на языке ассемблера, а не на языке более высокого уровня, таком как C, когда само ядро написано в основном на C?
17
foobar()
будет определяться с использованием встроенной сборки, одним способом на одной платформе и другим способом на другой. Это сводит использование asm к минимуму, но его нельзя полностью избежать.Ответы:
Язык абстрагирует доступ к регистрам ЦП, и ОС при обработке событий должна сохранять контекст, поэтому ему необходим доступ к регистрам в точке события, что нарушает спецификацию C.
источник
C - это абстракция от машинного кода, который выполняется на машине (хотя и гораздо ближе, чем большинство других языков).
Для этих вещей используются операторы машинного кода, которые не могут быть выражены в C, и, возможно, для дополнительной оптимизации, не предоставляемой сборкой компилятора C, в основном в виде встроенного ассемблера .
В дереве исходного кода ядра оно хранится
arch/<arch>
иinclude/asm-<arch>
где<arch>
находится конкретное имя архитектуры. На самом деле это лишь небольшая часть полного исходного кода ядра.источник
Вы не можете сделать это в C :)
Пытаюсь войти в защищенный режим x86. Очевидно, что я все еще могу сделать это в C, «испуская» необработанные машинные коды, но все же в случае, если мне требуется доступ к точным ошибкам - мне в основном не повезло.
Второй пример - BootLoader. В системах x86 требуется, чтобы традиционный загрузочный код имел длину ровно 512 байт, а последние два байта - 0xAA и 0x55 (или ровно 55 AA) соответственно ... Обеспечение компилятором C такой вещи - кошмар, а ассемблер работа фантастическим способом.
Есть еще много таких случаев, когда сборка не просто предпочтительна, а является единственным средством.
источник
Asm более тонкий и, как правило, намного быстрее, чем C, использующий библиотеки и т. д., и ОС обрабатывает МНОГО событий все время. Вы хотите тонкий и быстрый для этой функции.
источник