Intereting Posts

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

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

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

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

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

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

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

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

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

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

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

asm более тонкий и, как правило, намного быстрее, чем C, загруженный библиотеками и т. д., и ОС обрабатывает много событий ВСЕЙ времени. Для этой функции вам нужна тонкая и быстрая.