arm64_linux启动流程分析01_内核的入口
本次分析使用的linux内核的版本时 4.14.2, 读者可以自己下载了对照分析
首先看链接文件如下:
1 | ENTRY(_text) |
可以看到入口点在_text
. 而_text
是指向.head.text
段的起始位置. 所以内核是从.head.text
开始运行的. 那么这个段是写什么内容呢?
HEAD_TEXT
是一个宏#define HEAD_TEXT *(.head.text)
在arch/arm64/kernel/head.S
中有
1 | __HEAD |
所以对应到code, 内核是从_head
开始运行的. 这个开始点放置了一个arm64 linux的header:
1 | u32 code0; /* Executable code */ |
这个头的前两个位置放置的是可执行code
在开启UEFI支持时, add x13, x18, #0x16
这个code实际上是为了满足EFI格式的”MZ”头. 如果使用UEFI来启动kernel, 会识别出来并走UEFI启动的流程, 如果是普通的启动过程如使用uboot的booti进行引导, 那么第一条指令就是一条dummy指令. 第二条就跳转到stext
运行了.
1 | ENTRY(stext) |
这段代码就是内核启动是运行的初始化代码. 后面会分章节来详细描述.