Почему в некоторых операционных системах обработка событий пишется в asm, а не в c?

17

Мой вопрос заключается в том, почему в настоящее время некоторая обработка событий операционной системы все еще пишется на языке ассемблера, а не на языке более высокого уровня, таком как C, когда само ядро ​​написано в основном на C?

MAKZ
источник
5
«В основном в с» - и угадайте, что остальное? ;)
Златовласка
@Goldilocks хорошо это в сборе. Но почему, в то время как другие части находятся в c?
МАКЗ
4
Я не эксперт в этом, но есть некоторые вещи, связанные с аппаратным обеспечением низкого уровня, которые нельзя сделать в C; это обычно зависит от архитектуры. «Inline ASM» часто используется в коде C для этой цели, поэтому, например, foobar()будет определяться с использованием встроенной сборки, одним способом на одной платформе и другим способом на другой. Это сводит использование asm к минимуму, но его нельзя полностью избежать.
Златовласка
Как установить регистр указателя таблицы глобальных дескрипторов в C?
user253751 25.02.15

Ответы:

24

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

WrinkleFree
источник
Это на самом деле главная причина. Некоторые встроенные компиляторы C имеют расширения, которые позволяют им обращаться к регистрам (обычно через предварительно объявленные глобальные константы / переменные). Они могут сделать это, потому что они нацелены только на одну архитектуру. Но компиляторы общего назначения C нацелены на слишком много различных архитектур, чтобы сделать такие расширения разумными. Таким образом, они обычно просто реализуют механизм встраивания asm (кроме того, это сделает их нестандартными)
slebetman
18

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

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

В дереве исходного кода ядра оно хранится arch/<arch>и include/asm-<arch>где <arch>находится конкретное имя архитектуры. На самом деле это лишь небольшая часть полного исходного кода ядра.

кто-нибудь
источник
6

Вы не можете сделать это в C :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

Пытаюсь войти в защищенный режим x86. Очевидно, что я все еще могу сделать это в C, «испуская» необработанные машинные коды, но все же в случае, если мне требуется доступ к точным ошибкам - мне в основном не повезло.

Второй пример - BootLoader. В системах x86 требуется, чтобы традиционный загрузочный код имел длину ровно 512 байт, а последние два байта - 0xAA и 0x55 (или ровно 55 AA) соответственно ... Обеспечение компилятором C такой вещи - кошмар, а ассемблер работа фантастическим способом.

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

Кришна С Сантош
источник
-5

Asm более тонкий и, как правило, намного быстрее, чем C, использующий библиотеки и т. д., и ОС обрабатывает МНОГО событий все время. Вы хотите тонкий и быстрый для этой функции.

Escoce
источник
2
Оптимизация технологии компилятора C стала довольно хорошей. Это миф, что asm обычно намного быстрее, чем C. В любом случае, это не причина, по которой операционные системы низкого уровня используют asm. Это главным образом связано с операциями, которые не могут быть выражены в C, такими как барьеры памяти, и регистрирует танцы для соглашений о вызовах не-C и т. Д.
Celada