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...