linux 核心 核心啟動流程

2021-09-27 09:18:28 字數 2436 閱讀 5797

cs是**段暫存器,ip是指令指標暫存器(相當於偏移位址),儲存的是**指令的位址。cs:ip共同作用生成了**位址,具體演算法是cs左移4位+ip即是**位址。例如cs=0xf000,ip=0xfff0,則**位址為0xffff0.

.global/.globl 命令

.global symbol

.global 使得連線程式(ld)能夠識別 symbl

宣告symbol是全域性可見的。標號_start是gnu鏈結器用來指定第乙個要執行指令所必須的,同樣的是全域性可見的(並且只能出現在乙個模組中)

例如:.global _start    #定義 _start 為外部程式可以訪問的標籤

.section 命令

是組合語言匯中最為重要的命令之一,作用是定義記憶體段

該命令後只跟乙個引數,即它宣告的段的型別。

例如:.section .text        #定義文字段(**段)

.section .data        #定義資料段

.section .bss          #定義 bss 段

1.1、語法格式

.section section_name[,"flags"[,%type[,flag_specific_arguments]]]
1.2、作用

定義乙個段,每乙個段以段名為開始,以下乙個段名或者檔案結尾為結束。

elf格式允許的段標誌: a:可分配

w:可寫段

x:執行段

例子:.section ".customtext", "ax"

objdump -h a.out

idx name          size      vma               lma               file off  algn

0 .customtext   00000024  0000000000400078  0000000000400078  00000078  2**0

contents, alloc, load, readonly, code

標準支援的section, .data, .text, .bss

idx name          size      vma               lma               file off  algn

0 .text         00000024  00000000004000b0  00000000004000b0  000000b0  2**0

contents, alloc, load, readonly, code

1 .data         0000001c  00000000006000d4  00000000006000d4  000000d4  2**0

contents, alloc, load, data

首先cpu是需要訪問記憶體位址(dram)的。cpu上電之後直接將位址暫存器設定為0xffff fff0,這個位址的指令在做最終被解析成

bios中的rom中的乙個位址,這個位址會進行一下操作:

1、對硬體執行一系列測試,用來檢測現在有哪些裝置以及這些裝置是否正常運轉,這個階段被稱為post(power-on-self-test,加電自檢)。

2、初始化硬體裝置,這個階段保證所有的硬體裝置操作不會引起irq(中斷請求)線與i/o埠的衝突,最後顯示系統中安裝的所有pci裝置的乙個列表。

3、搜尋乙個作業系統來啟動。這個過程可以根據使用者設定的順序依次進行訪問系統中的軟盤、硬碟以及cd-rom的第乙個扇區(即引導扇區),通常是在開機時按del鍵進入bios的設定介面,但也可能是其他鍵,視各個具體的pc而定。

4、按上述訪問次序找到乙個有效裝置後,即將第乙個扇區的內容拷貝到ram中實體地址0x0000 7c00處,隨後跳轉到該位址開始執

bios過程只能在實模式下執行,所以linux一旦進入保護模式就不再使用bios,而是為計算機上的每個硬體裝置提供各自的裝置驅動程式

引導裝入程式是由bios裝載,用來把作業系統的核心映像裝載到ram中,該可執行程式存放在硬碟的第0個磁軌第0個扇區上,由於總共只需占用較少(512位元組)的儲存空間,故也可稱之為引導記錄,除此之外該引導記錄還包括64位元組的分割槽表以及2個位元組標識有效引導記錄結尾的標籤(0x55 0xaa).但從linux2.6開始不再執行這樣的引導裝入程式,這一點可以通過從header.s檔案剖析得知

我們也可以看到在完成post以及一系列的初始化工作後,bios將bootloader載入至實體地址0000 7c00處,而令人困惑的是,核心的啟動扇區bootsect的起始位址並未被嚴格限制,這其實是由於linux核心允許使用多種bootloader所導致的,比如前文所提到的lilo以及grub,在現實情況中存在更多不同型別的bootloader,不同的bootloader可能將實模式的起始位址載入至不同的位置,然而在x86架構下的grub設定的起始位址正是0x9 0000

linux核心啟動流程

linux核心啟動流程 計算機在啟動時都是先加電,然後進行硬體檢測並引導作業系統的初始化程式,然後作業系統的初始化程式程負責讀入系統核心並建產系統的執行環境.一這過程相對來說比較復而且與cpu體系結構相關,這裡我們通過linux並以i386的體系結構對這一過程進行較為詳細的說明.1 硬體檢測 當機器...

核心啟動流程

核心的初始化過程由start kernel函式開始,至第乙個使用者程序init結束,呼叫了一系列的初始化函式對所有的核心元件進行初始化。其中,start kernel rest init kernel init init post等4個函式構成了整個初始化過程的主線。start kernel函式 從...

linux核心 x86 32位核心啟動流程

arch x86 boot header.s 執行 start,第274行 global start start 然後跳轉執行start of setup,準備實模式建立堆疊,bss段清0,為下步c語言執行建立環境。start of setup 然後跳轉到c 執行main jump to c cod...