Где выполняется первый код ядра Zircon (Fuchsia) в этом файле start.S?

#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 инструкции.