ARM linux kernel從入口到start_kernel程式碼分析 — 只到machine type選中為止

來源:互聯網
上載者:User

轉載自:http://blog.sina.com.cn/bytex

 

本文針對arm linux,
從kernel的第一條指令開始分析,一直分析到進入start_kernel()函數.
我們當前以linux-2.6.19核心版本作為範例來分析,本文中所有的代碼,前面都會加上行號以便於和源碼進行對照.
例:
在檔案init/main.c中:
00478:
asmlinkage void __init start_kernel(void)
前面的"00478:"
表示478行,冒號後面的內容就是源碼了.

在分析代碼的過程中,我們使用縮排來表示各個代碼的調用層次.

由於啟動部分有一些代碼是平台特定的,雖然大部分的平台所實現的功能都比較類似,但是為了更好的對code進行說明,對於平台相關的代碼,我們選擇at91(ARM926EJS)平台進行分析.

另外,本文是以uncompressed kernel開始講解的.對於核心解壓縮部分的code,在
arch/arm/boot/compressed中,本文不做討論.

一. 啟動條件
通常從系統上電到執行到linux kenel這部分的任務是由boot
loader來完成.
關於boot loader的內容,本文就不做過多介紹.
這裡只討論進入到linux
kernel的時候的一些限制條件,這一般是boot loader在最後跳轉到kernel之前要完成的:
1.
CPU必須處於SVC(supervisor)模式,並且IRQ和FIQ中斷都是禁止的;
2. MMU(記憶體管理單元)必須是關閉的,
此時虛擬位址對物理地址;
3. 資料cache(Data cache)必須是關閉的
4.
指令cache(Instruction cache)可以是開啟的,也可以是關閉的,這個沒有強制要求;
5. CPU 通用寄存器0
(r0)必須是 0;
6. CPU 通用寄存器1 (r1)必須是 ARM Linux machine type (關於machine
type, 我們後面會有講解)
7. CPU 通用寄存器2 (r2) 必須是 kernel parameter list
的物理地址(parameter list 是由boot loader傳遞給kernel,用來描述裝置資訊屬性的列表,詳細內容可參考"Booting ARM
Linux"文檔).

二. starting kernel

首先,我們先對幾個重要的宏進行說明(我們針對有MMU的情況):


位置
預設值
說明
KERNEL_RAM_ADDR arch/arm/kernel/head.S
+26
0xc0008000
kernel在RAM中的的虛擬位址
PAGE_OFFSET include/asm-arm/memeory.h
+50 0xc0000000
核心空間的起始虛擬位址
TEXT_OFFSET arch/arm/Makefile
+137 0x00008000
核心相對於儲存空間的位移
TEXTADDR arch/arm/kernel/head.S
+49 0xc0008000
kernel的起始虛擬位址
PHYS_OFFSET include/asm-arm/arch-xxx/memory.h 平台相關
RAM的起始物理地址

核心的入口是stext,這是在arch/arm/kernel/vmlinux.lds.S中定義的:
00011:
ENTRY(stext)
對於vmlinux.lds.S,這是ld script檔案,此檔案的格式和彙編及C程式都不同,本文不對ld
script作過多的介紹,只對核心中用到的內容進行講解,關於ld的詳細內容可以參考ld.info
這裡的ENTRY(stext)
表示程式的入口是在符號stext.
而符號stext是在arch/arm/kernel/head.S中定義的:
下面我們將arm
linux
boot的主要代碼列出來進行一個概括的介紹,然後,我們會逐個的進行詳細的講解.

在arch/arm/kernel/head.S中
72 - 94 行,是arm linux boot的主代碼:

00072:
ENTRY(stext)
00073:
msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc
mode
00074:  @ and irqs
disabled
00075:  mrc p15,
0, r9, c0, c0 @ get processor
id
00076:
bl __lookup_processor_type @ r5=procinfo
r9=cpuid
00077:  movs r10,
r5 @ invalid processor (r5=0)?
00078:
beq __error_p @ yes, error
'p'
00079:
bl __lookup_machine_type @
r5=machinfo
00080:
movs r8, r5 @ invalid machine
(r5=0)?
00081:  beq __error_a @ yes, error
'a'
00082:
bl __create_page_tables
00083:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.