#assembly #fuchsia
#сборка #fuchsia
Вопрос:
Я читаю код сборки start.S для ядра Zircon (ОС Fuchsia):
https://fuchsia.googlesource.com/fuchsia/ /master/zircon/kernel/arch/arm64/start.S
Там есть эта строка:
.text
FUNCTION(_start)
Я думаю, что это первое, что когда-либо выполнялось в ядре. Однако, чтобы это было правдой, _start
оно должно быть глобальным. Я не смог определить, так это или нет.
Есть еще одна строка:
// This symbol is used by image.S
.global IMAGE_ELF_ENTRY
IMAGE_ELF_ENTRY = _start
это предполагает что-то вроде этого.
Что FUNCTION
включено FUNCTION(_start)
? Я попытался выполнить поиск «макрос ФУНКЦИИ СБОРКИ», но ничего не нашел, связанного с этим.
Похоже, что это первый запуск кода, но я не смог определить, где он переходит в реальный код ядра (код C ), поэтому я сомневаюсь.
Комментарии:
1.
FUNCTION
это директива сборки для обозначения начала функции. В этой ссылке сказано, что он используется для символов DWARF, я предполагаю, что он также делает символ видимым во всем мире. Обратите внимание, что я искал «функцию СБОРКИ arm», всегда включайте архитектуру в свои запросы 😉 Переход к ядру должен быть где-то здесь , но я не привык к ARM. Это просто выглядит как точка входа иbl .
выглядит как бесконечный резервный цикл.
Ответ №1:
Определение этих макросов можно найти в //zircon/kernel/include/asm.h
, это в основном оболочка, которая добавляет все необходимые аннотации, включая директивы CFI.
Так FUNCTION(_start)
что будет расширяться до:
.global _start;
.hidden _start;
.type _start,STT_FUNC;
_start:
.cfi_startproc
Переход на код C происходит по bl lk_main
инструкции.