Що таке .S-файли?


79

Я бачив .Sфайли в різних проектах, таких як ядро ​​Linux, ядро ​​FreeBSD або деякі інші проекти. Що роблять ці файли і чому .cзамість цього ми не можемо мати файли?

Відповіді:


84

.Sфайли - це файли вихідного коду, написані у збірці. Асамблея є надзвичайно низьким рівнем програмування. Файли містять інструкції щодо складання процесора в послідовному порядку і, як правило, компілюються на основі обраної архітектури. Приклади таких файлів часто можна побачити в ядрі Linux для конкретних архітектур, наприклад x86, sparc, ARM тощо.

Для отримання додаткової інформації про мову асемблера:


4
Чому це не називається .asm?
Liga

Бо хтось віддав перевагу .s.
user14387228

47

Це .Sмова асемблерів. Зазвичай це так

Щось, про що ніхто не згадував, чому саме S?

  • .S(капітал S) означає код збірки, який все одно повинен проходити через попередній процесор. Це означає, що він може мати #includeта #defineсеред інших макросів. Це також може розглядатися як розширення.sx

  • .s (нижній s) - це чистий код збірки, який можна скомпілювати в об'єкт.

Чому не використовувати .c? Що ж, будучи операційною системою, неможливо написати все на Сі . Насправді це було б ідеально, і сама мова C має фонову історію, пов’язану із створенням операційних систем та зменшенням кількості збірки, необхідної для її кодування. Але багато операцій на низькому рівні занадто залежать від машини.

Ось гарний приклад рутинної копії пам'яті для завантаження Linux, яке використовує

#include <linux/linkage.h>


3
Ця відповідь дуже важлива. Дійсно, випадок розширення є критичним. Це може бути кошмаром для деяких ОС (тобто Windows), які не цікавляться випадком розширення!
SiZiOUS

13

Файли .S - це файли збірки.

Чому .S та чому не файли .c?

Це тому, що машинозалежні речі / рання ініціалізація, такі як налаштування кеш-пам’яті, можуть виконуватися лише вказівками рівня збірки, такими як інструкції вводу-виводу.

Ядро не має розкоші бібліотеки libc, щоб подбати про початкове налаштування різних ресурсів. А апаратні ресурси в будь-який момент, навіть під час виконання програми, по черзі викликають системні виклики, які викликають процедури вводу-виводу, закодовані мовою асемблера.


8

.SРозширення вказує на файл на мові асемблера .

Чому ми не маємо .C файли замість цього?

Оскільки вихідний код - будь то введений людиною чи створений компілятором - це збірка, а не C.


Посилання порушено.
Danijel

5

Вони є файлами коду асемблера :

Мова асемблер - це мова програмування низького рівня для комп’ютерів, мікропроцесорів, мікроконтролерів та інших програмованих пристроїв, в яких кожен вираз відповідає одній інструкції машинної мови. Мова асемблер специфічна для певної архітектури комп'ютера, на відміну від більшості мов програмування високого рівня, які можуть бути більш портативними.

і, отже, ці файли не тотожні файлам коду C.

Зверніть увагу, що файли C можуть бути вбудовані з інструкціями щодо складання .


4

Файли .S - це файли мови збірки. Вони є формою машинного коду. Це на низькому рівні програмування. Весь машинно залежний код написаний мовою збірки. Мова збірки для різних процесорів різна.


2

Файли .S - це код, написаний мовою асемблерів, тобто низький рівень програмування. У вихідному коді ядра Linux, .S, як правило, є початковими файлами, які ядро ​​запускає, коли ядро ​​Linux починає завантажуватися (наприклад,: - head.S). Ми пишемо це в .S, а не в .C, оскільки ми не готові до запуску скомпільованого .C-файлу .O на даний момент. Нам потрібно працювати з регістрами, залежними від архітектури, і запустити ядро.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.