娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

ARM Linux內核啟動過程

發布者:溫馨陽光最新更新時間:2024-09-25 來源: elecfans關鍵字:ARM  Linux 手機看文章 掃描二維碼
隨時隨地手機看文章

LinuxKernelStartARM  

ARM Linux內核啟動過程.

Updated Feb 24, 2011 by swordhui...@gmail.com

注: 本文轉自ChinaUnix 作者為XPL.

本文針對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_ADDRarch/arm/kernel/head.S +260xc0008000kernel在RAM中的的虛擬地址
PAGE_OFFSETinclude/asm-arm/memeory.h +500xc0000000內核空間的起始虛擬地址
TEXT_OFFSETarch/arm/Makefile +1370x00008000內核相對于存儲空間的偏移
TEXTADDRarch/arm/kernel/head.S +490xc0008000kernel的起始虛擬地址
PHYS_OFFSETinclude/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:                                                                     
00084:         /*                                                                 
00085:          * The following calls CPU specific code in a position independent
00086:          * manner.  See arch/arm/mm/proc-*.S for details.  r10 = base of   
00087:          * xxx_proc_info structure selected by __lookup_machine_type      
00088:          * above.  On return, the CPU will be ready for the MMU to be      
00089:          * turned on, and r0 will hold the CPU control register value.     
00090:          */                                                               
00091:         ldr        r13, __switch_data                @ address to jump to after
00092:                                                 @ mmu has been enabled     
00093:         adr        lr, __enable_mmu                @ return (PIC) address     
00094:         add        pc, r10, #PROCINFO_INITFUNC                                

其中,73行是確保kernel運行在SVC模式下,并且IRQ和FIRQ中斷已經關閉,這樣做是很謹慎的.

arm linux boot的主線可以概括為以下幾個步驟:

  • 1. 確定 processor type (75 - 78行)

  • 2. 確定 machine type (79 - 81行)

  • 3. 創建頁表 (82行)

  • 4. 調用平臺特定的cpu_flush函數 (在struct proc_info_list中) (94 行)

  • 5. 開啟mmu (93行)

  • 6. 切換數據 (91行)

最終跳轉到start_kernel (在switch_data的結束的時候,調用了 b start_kernel)

下面,我們按照這個主線,逐步的分析Code.

1. 確定 processor type

 

arch/arm/kernel/head.S中:

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'          

75行: 通過cp15協處理器的c0寄存器來獲得processor id的指令. 關于cp15的詳細內容可參考相關的arm手冊

76行: 跳轉到lookup_processor_type.在lookup_processor_type中,會把processor type 存儲在r5中

77,78行: 判斷r5中的processor type是否是0,如果是0,說明是無效的processor type,跳轉到error_p(出錯)

lookup_processor_type 函數主要是根據從cpu中獲得的processor id和系統中的proc_info進行匹配,將匹配到的proc_info_list的基地址存到r5中, 0表示沒有找到對應的processor type.

下面我們分析lookup_processor_type函數

arch/arm/kernel/head-common.S中:

00145:         .type        __lookup_processor_type, %function
00146: __lookup_processor_type:
00147:         adr        r3, 3f
00148:         ldmda        r3, {r5 - r7}
00149:         sub        r3, r3, r7                        @ get offset between virt&phys
00150:         add        r5, r5, r3                        @ convert virt addresses to
00151:         add        r6, r6, r3                        @ physical address space
00152: 1:        ldmia        r5, {r3, r4}                        @ value, mask
00153:         and        r4, r4, r9                        @ mask wanted bits
00154:         teq        r3, r4
00155:         beq        2f
00156:         add        r5, r5, #PROC_INFO_SZ                @ sizeof(proc_info_list)
00157:         cmp        r5, r6
00158:         blo        1b
00159:         mov        r5, #0                                @ unknown processor
00160: 2:        mov        pc, lr
00161:
00162: /*
00163:  * This provides a C-API version of the above function.
00164:  */
00165: ENTRY(lookup_processor_type)
00166:         stmfd        sp!, {r4 - r7, r9, lr}
00167:         mov        r9, r0
00168:         bl        __lookup_processor_type
00169:         mov        r0, r5
00170:         ldmfd        sp!, {r4 - r7, r9, pc}
00171:
00172: /*
00173:  * Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for
00174:  * more information about the __proc_info and __arch_info structures.
00175:  */
00176:         .long        __proc_info_begin
00177:         .long        __proc_info_end
00178: 3:        .long        .
00179:         .long        __arch_info_begin
00180:         .long        __arch_info_end

[1] [2] [3] [4] [5] [6]
關鍵字:ARM  Linux 引用地址:ARM Linux內核啟動過程

上一篇:玩轉S3C6410之一 交叉工具鏈制作(gcc4.5.1-armv6-vfp)
下一篇:s3c6410學習筆記-燒寫uboot+構建文件系統

推薦閱讀最新更新時間:2025-04-05 23:34

解析基于ARMLinux 通用工控硬件平臺的設計
簡介:本文針對嵌入式系統的特點,以高性價比的32位arm嵌入式處理器AT91RM9200為硬件核心,搭建了通用工控硬件平臺,在此平臺上移植嵌入式Linux操作系統和圖形界面開發環境MiniGUI。以此通用工控平臺為基礎,可以方便地構建工程應用所需的絕大部分自動測控系統。其應用無論是在性能還是在成本方面都極具競爭力,這預示著本平臺具有較好的應用前景。 隨著工控技術的進步和市場競爭的加劇,開發人員通常需要在盡可能短的時間內設計出滿足用戶要求的測控系統。本文針對嵌入式系統的特點,以高性價比的32位arm嵌入式處理器AT91RM9200為硬件核心,搭建了通用工控硬件平臺,在此平臺上移植嵌入式Linux操作系統和圖形界面開發環境Mini
[單片機]
解析基于<font color='red'>ARM</font> 和<font color='red'>Linux</font> 通用工控硬件平臺的設計
ARM9:如何將linux2.6.38內核移植到TQ2440
  下面是linux2.6.38內核移植到TQ2440的具體步驟:   1.修改根目錄的Makefile中的ARCH=arm,CROSS-COMPILE=arm-linux-   2.在arch/arm/mach-s3c2440/mach-smdk2440.c中,將163行的s3c24xx_init_clocks(16934400)改為s3c24xx_init_clocks(12000000)。   3.修改arch/arm/tools/mach-types中379行的362改為168,因為uboot中定義的機器碼是168.   4.修改arch/arm/boot/中的Makefile文件,在58行添加@cp -f
[單片機]
基于ARMLinux系統移植的方法
Linux具有源代碼開放、效率高、可裁剪等優點,在嵌入式系統的開發中具有廣泛的應用。文章介紹了嵌入式Linux操作系統、移植目標平臺SBC2410及Linux內核源代碼的目錄結構,分析了Linux移植到SBC2410平臺的實現過程,闡述了Linux內核、u-boot的裁剪和編譯以及根文件系統的制作過程,最后在SBC2410平臺上成功移植了嵌入式Linux系統。 嵌入式系統是一個專用的計算機系統。該系統以計算機技術為基礎,軟硬件可裁減,但對功能、可靠性、成本等都有嚴格的要求。今天,一些專用系統需要處理大量的信息,由于傳統的計算機系統很難實現硬件可裁減,因而已經不能滿足專用系統的需要。伴隨著我國汽車、家電等產業的快速發展,
[單片機]
基于<font color='red'>ARM</font>的<font color='red'>Linux</font>系統移植的方法
arm-linux連接以及連接腳本
前言:arm linux的連接工具可以使用arm-linux-ld,在進行連接時可以使用-T命令采用腳本控制,如不指明腳本,則使用默認的腳本文件,參見 arm-linux-ld的缺省linker script 。 一. 目標文件格式與類型 GNU C compiler根據源文件的后綴名來對文件進行預處理、匯編或編譯操作。在編譯鏈接時,生成的目標文件都是ELF格式的(可執行鏈接格式,Executable and Linking Format)。Object文件格式有三種類型: (1)可重定位(relocatable)文件:用來和其他的object文件一起鏈接為一個可執行文件(executable)或一個共享文件(.so文件,sha
[單片機]
Linux下的 ARM裸機調試環境搭建(GDB + JLink)
說明:我也是調試u-boot,在win下OK了,基于這里,然后為了完全在linux下便有了下邊轉載的內容。下文會對照我自己的操作進行結果補充!感覺補充的多于轉載的就改為原創了,讓更多人看到! 一直想擺脫windows環境,在純linux下進行arm裸機開發,但是由于一直不知道JLink如何在linux下運行和配置,一直無法進行下去。以前都是windows+AXD調試。包括本人用的FL2440開發板和JLink調試器也沒有提供在linux調試的文檔。前些天由于想研究下U-BOOT的源代碼,不得不在linux下編譯,就google到了眾多大牛的帖子,且找到了JLink的官方linux版。綜合各位大牛的經驗,最終成功的在純lin
[單片機]
純<font color='red'>Linux</font>下的 <font color='red'>ARM</font>裸機調試環境搭建(GDB + JLink)
基于ARM9上linux系統的bootloader設計
1.引言 在嵌入式開發中其中不可避免的一環就是bootloader的設計 ,它統籌軟硬件資源,使得資源最優配置,嵌入式系統對功耗,性能,以及成本要求很苛刻,它要求在達到用戶要求的前提下把成本和資源利用降為最低,Booloader不是驅動開發的一部分,但一個好的booloader可以決定該產品在市場上的成敗 。 采用Samsung公司的ARM920T 處理器與Linux2.4.18嵌入式操作系統,根據處理速度和效率的不同采用分階段實現的方法,在具體實現時不拘泥于該處理器和操作系統版本,使之更有普遍性和通用性。 2.bootloader概述 引導加載程序bootloader是系統加電后運行的第一段代碼 ,功能類似pc機的BIO
[單片機]
基于<font color='red'>ARM</font>9上<font color='red'>linux</font>系統的bootloader設計
ARM在嵌入式linux內核裁剪與移植的應用
微處理器用一片或少數幾片大規模集成電路組成的中央處理器。這些電路執行控制部件和算術邏輯部件的功能。微處理器與傳統的中央處理器相比,具有體積小,重量輕和容易模塊化等優點。微處理器的基本組成部分有:寄存器堆、運算器、時序控制電路,以及數據和地址總線。微處理器能完成取指令、執行指令,以及與外界存儲器和邏輯部件交換信息等操作,是微型計算機的運算控制部分。它可與存儲器和外圍電路芯片組成微型計算機。但這些專用操作系統都是商業化產品,其高昂的價格使許多低端產品的小公司望而卻步;而且,源代碼封閉性也大大限制了開發者的積極性。而Linux的開放性,使得許多人都認為Linux非常適合多數Intemet設備。Linux操作系統可以支持不同的設備和不同的
[單片機]
基于ARM的嵌入式Linux應用程序開發研究
0 引 言   當今社會,嵌入式系統已經滲透到人們工作、生活中的各個領域,嵌入式處理器已占分散處理器市場份額的94%。而嵌入式Linux系統也蓬勃發展,不僅繼承了Linux源碼開放、內核穩定高效、軟件豐富等優勢,還具備支持廣泛處理器結構和硬件平臺、占有空間小、成本低廉、結構緊湊等特點。 1 ARM處理器及開發板   在嵌入式領域,ARM已取得了極大的成功,造就了IP核商業化、市場化的神話。據統計,全球有103家巨型IT公司在采用ARM技術,20家最大的半導體,一商中有19家是ARM的用戶。ARM系列芯片已經被廣泛的應用于移動電活、手持式計算機以及各種各樣的嵌入式應用領域,成為世界上銷量最大的32位微處理器。ARM已成為業界實
[工業控制]
基于<font color='red'>ARM</font>的嵌入式<font color='red'>Linux</font>應用程序開發研究
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 乐至县| 秭归县| 宜都市| 广汉市| 黎川县| 沾益县| 从化市| 苏州市| 石屏县| 观塘区| 遂川县| 齐齐哈尔市| 格尔木市| 吉水县| 榕江县| 泰和县| 迁安市| 淮滨县| 蒙阴县| 集贤县| 龙州县| 广丰县| 长寿区| 蓬溪县| 西丰县| 逊克县| 西乡县| 新营市| 随州市| 唐河县| 常熟市| 武安市| 古交市| 尼玛县| 贡嘎县| 青阳县| 甘孜县| 万宁市| 武定县| 永嘉县| 台中县|