Я бачив .Sфайли в різних проектах, таких як ядро Linux, ядро FreeBSD або деякі інші проекти. Що роблять ці файли і чому .cзамість цього ми не можемо мати файли?
Я бачив .Sфайли в різних проектах, таких як ядро Linux, ядро FreeBSD або деякі інші проекти. Що роблять ці файли і чому .cзамість цього ми не можемо мати файли?
Відповіді:
.Sфайли - це файли вихідного коду, написані у збірці. Асамблея є надзвичайно низьким рівнем програмування. Файли містять інструкції щодо складання процесора в послідовному порядку і, як правило, компілюються на основі обраної архітектури. Приклади таких файлів часто можна побачити в ядрі Linux для конкретних архітектур, наприклад x86, sparc, ARM тощо.
Для отримання додаткової інформації про мову асемблера:
.s.
Це .Sмова асемблерів. Зазвичай це так
Щось, про що ніхто не згадував, чому саме S?
.S(капітал S) означає код збірки, який все одно повинен проходити через попередній процесор. Це означає, що він може мати #includeта #defineсеред інших макросів. Це також може розглядатися як розширення.sx
.s (нижній s) - це чистий код збірки, який можна скомпілювати в об'єкт.
Чому не використовувати .c? Що ж, будучи операційною системою, неможливо написати все на Сі . Насправді це було б ідеально, і сама мова C має фонову історію, пов’язану із створенням операційних систем та зменшенням кількості збірки, необхідної для її кодування. Але багато операцій на низькому рівні занадто залежать від машини.
Ось гарний приклад рутинної копії пам'яті для завантаження Linux, яке використовує
#include <linux/linkage.h>
Файли .S - це файли збірки.
Чому .S та чому не файли .c?
Це тому, що машинозалежні речі / рання ініціалізація, такі як налаштування кеш-пам’яті, можуть виконуватися лише вказівками рівня збірки, такими як інструкції вводу-виводу.
Ядро не має розкоші бібліотеки libc, щоб подбати про початкове налаштування різних ресурсів. А апаратні ресурси в будь-який момент, навіть під час виконання програми, по черзі викликають системні виклики, які викликають процедури вводу-виводу, закодовані мовою асемблера.
.SРозширення вказує на файл на мові асемблера .
Чому ми не маємо .C файли замість цього?
Оскільки вихідний код - будь то введений людиною чи створений компілятором - це збірка, а не C.
Вони є файлами коду асемблера :
Мова асемблер - це мова програмування низького рівня для комп’ютерів, мікропроцесорів, мікроконтролерів та інших програмованих пристроїв, в яких кожен вираз відповідає одній інструкції машинної мови. Мова асемблер специфічна для певної архітектури комп'ютера, на відміну від більшості мов програмування високого рівня, які можуть бути більш портативними.
і, отже, ці файли не тотожні файлам коду C.
Зверніть увагу, що файли C можуть бути вбудовані з інструкціями щодо складання .
Файли .S - це код, написаний мовою асемблерів, тобто низький рівень програмування. У вихідному коді ядра Linux, .S, як правило, є початковими файлами, які ядро запускає, коли ядро Linux починає завантажуватися (наприклад,: - head.S). Ми пишемо це в .S, а не в .C, оскільки ми не готові до запуску скомпільованого .C-файлу .O на даний момент. Нам потрібно працювати з регістрами, залежними від архітектури, і запустити ядро.
.asm?