Чому деякі події операційних систем записуються в ASM замість c?


17

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


5
"Здебільшого в с" - і здогадайтеся, що решта? ;)
goldilocks

@goldilocks добре це в зборі. Але чому, хоча інші частини знаходяться в c?
MAKZ

4
Я не експерт з цього питання, але є деякі речі, пов'язані з апаратним забезпеченням, які неможливо зробити в C; зазвичай це архітектура. "Inline ASM" часто використовується в коді C для цієї мети, тому, наприклад, foobar()буде визначено, використовуючи вбудовану збірку, один шлях на одній платформі та інший шлях на іншій. Це зводить використання asm до мінімуму, але цього не можна повністю уникнути.
goldilocks

Як встановити регістр глобального вказівника таблиць дескрипторів на C?
користувач253751

Відповіді:


24

Мова абстрагує доступ до регістрів процесора, а ОС під час обробки подій повинна зберігати контекст, тому їй потрібен доступ до регістрів у точці події, тим самим порушуючи специфікацію 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 АА) відповідно ... Забезпечення такої речі за допомогою компіляторів C - це кошмар, а асемблер робить робота фантастично.

Є ще багато таких випадків, коли збірка не просто бажана - але є єдиним засобом.


-5

ASM тонше і, як правило, набагато швидше, ніж C, що поєднується з бібліотеками тощо, і ОС обробляє багато подій ВСЕ час. Ви хочете, щоб ця функція була стрункою і швидкою.


2
Оптимізація технології компілятора C стала досить непоганою. Це міф про те, що asm, як правило, набагато швидше, ніж C. У будь-якому випадку, це не є причиною того, що операції операційної системи низького рівня використовують asm. В основному це стосується операцій, які неможливо виразити на C, як бар'єри пам'яті, та реєструвати танці для конвенцій, що не стосуються C, тощо ...
Целада,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.