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

2021-07-31 13:30:11 字數 2487 閱讀 8600

彙編階段主要是arch/arm/kernel/目錄下的head.s檔案,主要完成以下內容:

(1)校驗啟動合法性;(cpu id,機器碼,uboot給核心的傳參格式)

(2)建立段式對映的頁表並開啟mmu以方便使用記憶體;

(3)構建c執行環境,跳入c階段。

(1)kernel_ram_vaddr(vaddr就是virtual address),這個巨集定義了核心執行時的虛擬位址,值為0xc0008000。

(2)kernel_ram_paddr(paddr就是physical address),這個巨集定義核心執行時的實體地址,值為0x30008000。

(3)因此,核心執行的實體地址是0x30008000,對應的虛擬位址是0xc0008000。

(1)__head定義了段名為.head.text的段。

(2)entry(stext)表明核心的真正入口。

(3)uboot啟動核心後,實際呼叫zimage前面的那段未經壓縮的解壓**,解壓**執行時先將zimage後面的部分解壓開,然後再去呼叫執行真正的核心入口(即這裡)。

(4)核心啟動需要一定的先決條件,這個條件由啟動核心的bootloader(比如uboot)來構建保證。

(5)arm體系中,函式呼叫時實際是通過暫存器傳參的(函式呼叫時傳參有兩種設計:一種是暫存器傳參,另一種是棧記憶體傳參)。

(6)此時mmu是關閉的,因此硬體上需要的是實體地址。

(1)cp15協處理器的c0暫存器中讀取出硬體的cpu id號,然後呼叫__lookup_processor_type來進行合法性檢驗。

(2)__lookup_processor_type檢驗cpu id合法性的方法

(3)核心啟動時設計這個校驗,也是為了核心啟動的安全性著想。

(4)__lookup_machine_type函式的設計理念和思路和上面校驗cpu id的函式一樣的,不同之處是本函式校驗的是機器碼。

(1)該函式的設計理念和思路和上面2個一樣,用來校驗uboot給核心的傳參atags格式是否正確。

(2)uboot給核心傳參的部分如果不對,會導致核心啟動不起來。譬如uboot的bootargs設定不正確,則核心可能就會不啟動。

(1)此函式用來建立頁表。

(2)linux核心本身被連線在虛擬位址處,因此kernel希望盡快建立頁表並且啟動mmu進入虛擬位址工作狀態。

(3)kernel建立頁表分為2步。

(4)核心啟動的早期建立段式頁表,並在核心啟動早期使用;核心啟動的後期再次建立細頁表並啟用。等核心工作起來後,就只有細頁表了。

(1)建立段式頁表後進入__switch_data部分,它是乙個函式指標陣列。

(2)分析得知下一步要執行__mmap_switched函式。

1、makefile分析

(1)makefile中剛開始定義了kernel的核心版本號。這個版本號在模組化驅動安裝時會需要用到。

(2)在make編譯核心時,可以通過命令列給核心makefile傳參。譬如make o=***可以指定到另外乙個單獨資料夾下編譯。

(3)kernel的頂層makefile中定義了2個變數,乙個是arch,乙個是cross_compile。

2、鏈結指令碼分析

(1)分析連線指令碼,找到整個程式的entry。

(2)kernel的連線指令碼並不是直接提供的,而是提供了乙個彙編檔案vmlinux.lds.s,然後在編譯的時候再去編譯這個彙編檔案得到真正的鏈結指令碼vmlinux.lds。

(3)vmlinux.lds.s在arch/arm/kernel/目錄下。

(4)為什麼linux kernel不直接提供vmlinux.lds?

(5)整個程式入口在**?

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

kernel版本 5.10 平台 arm64 本專題主要基於 arm64 linux head.s的執行流程 系列文章,前者是基於3.18,本專題針對的是核心5.10。主要分析head.s的執行過程。vmlinux.lds中定義了入口點為 text entry text sections kimag...

MySQL簇的啟動階段

17.6.1.mysql簇的啟動階段 本節介紹了啟動簇時涉及的步驟。有數種不同的啟動型別和模式,如下所述 首次啟動 在所有節點上與乾淨的檔案系統一起啟動簇。這或是出現在首次啟動簇時,或是使用 initial 選項 重啟簇時。系統重啟 簇啟動並讀取儲存在資料節點中的資料。這出現在下述情況下 使用完後關...

核心的啟動流程

前言本文基於linux 4.0核心的啟動流程非常複雜.大概分為三個過程 這個流程不是必須的 如果核心映象沒有壓縮 vmlinux 就不需要解壓縮 但如果壓縮了,可以讓bootloader解壓,然後也可以讓核心解壓,一般是核心自解壓 1.發生條件 核心為壓縮檔案,且bootloader 沒有解壓核心 ...