Я знаю, що коли компілюється вихідний код, скажімо, C ++, вихід із компілятора - це машинний код (виконуваний файл), який, на мою думку, був інструкцією безпосередньо до процесора. Нещодавно я читав на ядрах і виявив, що програми не можуть отримати доступ до апаратного забезпечення безпосередньо, але повинні пройти через ядро.
Отже, коли ми компілюємо простий вихідний код, скажімо, лише за допомогою printf()
функції, і компіляція створює виконуваний машинний код, чи буде кожна інструкція в цьому машинному коді безпосередньо виконуватися з пам'яті (як тільки код завантажується в пам'ять ОС) або буде кожну команду в машинному коді все-таки потрібно пройти через ОС (ядро) для виконання?
Я прочитав подібне запитання . Він не пояснив, чи машинний код, який генерується після компіляції, - це інструкція безпосередньо до центрального процесора, чи потрібно буде знову пройти через ядро, щоб створити правильну інструкцію для ЦП. Тобто, що відбувається після завантаження машинного коду в пам'ять? Чи пройде воно через ядро чи безпосередньо поговорить з процесором?
printf
не є чудовим прикладом. Спеціалізація C чітко визначається як функція, яка доступна лише у "розміщених" реалізаціях (мається на увазі виконання ядра на відміну від "автономного", який може не потребувати). А на більшості платформ printf
- це просто функція, яку надає ваша компанія, libc
яка виконує купу матеріалів від вашого імені (що врешті-решт включає в себе системний виклик для друку до stdout). Це насправді нічим не відрізняється від виклику libvlc_media_list_add_media
або PyObject_GetAttr
, за винятком того, що деяка printf
реалізація гарантована між собою без додавання додаткових нестандартних -l
s.