kernel啟動流程 head S的執行 1 概述

2021-10-12 03:10:50 字數 3771 閱讀 8856

kernel版本:5.10

平台:arm64

本專題主要基於《arm64_linux head.s的執行流程》系列文章,前者是基於3.18,本專題針對的是核心5.10。主要分析head.s的執行過程。

vmlinux.lds中定義了入口點為_text

...

....

entry

(_text)..

....

.sections

.= kimage_vaddr;

.head.text :

.text :..

....

}

其中head_text 定義如下, 它用於存放kernel image header:

#include/asm-generic/vmlinux.lds.h 

/* section used for early init (in .s files) */

#define head_text keep(*(.head.text))

由此可知head.s文字段的位址為_text

_text所在的位置由kimage_vaddr決定,kimage_vaddr定義在arch/arm64/include/asm/memory.h中,定義如下:

#define kimage_vaddr            (modules_end)

#define modules_end (modules_vaddr + modules_vsize)

#define modules_vaddr (bpf_jit_region_end)

#define modules_vsize (sz_128m)

#define bpf_jit_region_end (bpf_jit_region_start + bpf_jit_region_size)

#define bpf_jit_region_start (kasan_shadow_end)

#define bpf_jit_region_size (sz_128m)

#define kasan_thread_shift 0

#define kasan_shadow_end (_page_end(va_bits_min))

#define va_bits_min (va_bits)

#define _page_end(va) (-(ul(1) << ((va) - 1)))

此處由於沒有開啟kasan, 因此:

kasan_shadow_end = -(1ul << (48 - 1)) = ffff800000000000,

bpf_jit_region_start =ffff800000000000

bpf_jit_region_end=ffff800000000000+ sz_128m=0xffff800008000000

modules_vaddr = 0xffff800008000000

modules_end = 0xffff800008000000 + sz_128m = 0xffff800010000000

kimage_vaddr = 0xffff800010000000

1

2 vmlinux: file format elf64-littleaarch64

345 disassembly of section .head.text:

67 ffff800010000000 <_text>

:8 ffff800010000000:

91005a4d add x13, x18, #0x16

9 ffff800010000004:

1444ffff b ffff800011140000 <__init_begin>..

....

通過ktdump節點可以看到kimage_vaddr(0xffff800010000000),所處的區域位於vmalloc(0xffff800010000000-0xfffffdffbfff0000)

/sys/kernel/debug # cat kernel_page_tables 

0x0000000000000000

-0xffff000000000000

0xffff000000000000

-0xffff000000200000

0xffff000000200000

-0xffff000001200000

0xffff000001200000

-0xffff000001340000

0xffff000001340000

-0xffff000002643000

0xffff000002643000

-0xffff000002644000

0xffff000002644000

-0xffff000040000000

0xffff000040000000

-0xffff008000000000

0xffff008000000000

-0xffff800000000000---

------

[ bpf start ]---

0xffff800000000000

-0xffff800008000000---

[ bpf end ]---

---[ modules start ]---

0xffff800008000000

-0xffff800010000000---

[ modules end ]---

---[vmalloc

() area ]---

0xffff800010000000

-0xfffffdffbfff0000---

[vmalloc

() end ]---

0xfffffdffbfff0000

-0xfffffdffc0000000

0xfffffdffc0000000

-0xfffffdfffe400000

0xfffffdfffe400000

-0xfffffdfffe5f9000---

[ fixmap start ]---

0xfffffdfffe5f9000

-0xfffffdfffea00000---

[ fixmap end ]---

0xfffffdfffea00000

-0xfffffdfffec00000---

[ pci i/o start ]---

0xfffffdfffec00000

-0xfffffdffffc00000---

[ pci i/o end ]---

0xfffffdffffc00000

-0xfffffdffffe00000---

[ vmemmap start ]---

0xfffffdffffe00000

-0x0000000000000000

arm64的啟動過程之(一):核心第乙個腳印

arm64的啟動過程之(二):建立啟動階段的頁表

arm64的啟動過程之(三):為開啟mmu而進行的cpu初始化

arm64的啟動過程之(四):開啟mmu

documents/arm64/booting.rst

Kernel啟動概要

1 bootloader分析,以uboot為主,結合具體開發板的情況。我的目標是解釋清楚uboot的工作原理 說實話,分析過程中不太想被硬體綁架,但是需要以乙個實際的例子 來做分析 2 kernel部分,這就很多內容了。打算從kernel啟動的流程開始分析。3 除kernel本身外,還有很多的知識,...

Kernel啟動概要

最近幾個月將linux kernel的大概研究了一下,下面需要進行深入詳細的分析。主要將以s3c2440的一塊開發板為硬體實體。大概包括如下內容 1 bootloader分析,以uboot為主,結合具體開發板的情況。我的目標是解釋清楚uboot的工作原理 說實話,分析過程中不太想被硬體綁架,但是需要...

核心啟動的彙編階段 head S檔案

彙編階段主要是arch arm kernel 目錄下的head.s檔案,主要完成以下內容 1 校驗啟動合法性 cpu id,機器碼,uboot給核心的傳參格式 2 建立段式對映的頁表並開啟mmu以方便使用記憶體 3 構建c執行環境,跳入c階段。1 kernel ram vaddr vaddr就是vi...