linux启动流程导读(arm为例)

发布者:静心静气最新更新时间:2016-04-27 来源: eefocus关键字:linux  启动流程  arm 手机看文章 扫描二维码
随时随地手机看文章
以arm为例,分析一下kernel的启动过程;

内核版本:linux-3.2.tar.gz

一、arch/arm/kernel/head.s


     .arm
 
     __HEAD                          @#define __HEAD  .section ".head.text","ax"
 ENTRY(stext)
 
  THUMB(    adr    r9, BSYM(1f)      @ Kernel is always entered in ARM.
  THUMB(    bx    r9          @ If this is a Thumb-2 kernel,
  THUMB(    .thumb              @ switch to Thumb now.
  THUMB(1:            )
 
     setmode    PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode   关闭普通中断,快速中断,使能svc模式
                         @ and irqs disabled
     mrc    p15, 0, r9, c0, c0        @ get processor id         获得芯片ID
     bl    __lookup_processor_type        @ r5=procinfo r9=cpuid 获得处理器型号,r5 == id,#1
     movs    r10, r5                @ invalid processor (r5=0)?  校验正确性,0错误
  THUMB( it    eq )        @ force fixup-able long branch encoding
     beq    __error_p            @ yes, error 'p'
 
 #ifndef CONFIG_XIP_KERNEL
     adr    r3, 2f
     ldmia    r3, {r4, r8}
     sub    r4, r3, r4            @ (PHYS_OFFSET - PAGE_OFFSET)

     add    r8, r8, r4            @ PHYS_OFFSET

==========

#1 :arch/arm/kernel/head-common.h

==========


     __CPUINIT
 __lookup_processor_type:
     adr    r3, __lookup_processor_type_data        @adr 相对偏移读取,读取下面type_data地址
     ldmia    r3, {r4 - r6}       @将该地址存放的值 放入r4(.),r5(begin),r6(end)
     sub    r3, r3, r4            @ get offset between virt&phys   链接地址-实际地址=偏移量

==========

继续arch/arm/kernel/head.s

==========


     bl    __vet_atags       @#1,head-common.s
 #ifdef CONFIG_SMP_ON_UP
     bl    __fixup_smp       @略
 #endif
 #ifdef CONFIG_ARM_PATCH_PHYS_VIRT
     bl    __fixup_pv_table  @略
 #endif
     bl    __create_page_tables  @#2

==========

#1 :arch/arm/kernel/head-common.h

==========


 __vet_atags:
     tst    r2, #0x3            @ aligned? 不对其就返回
     bne    1f
 
     ldr    r5, [r2, #0]        @读到r5
 #ifdef CONFIG_OF_FLATTREE
     ldr    r6, =OF_DT_MAGIC        @ is it a DTB?  过滤DTB
     cmp    r5, r6
     beq    2f
 #endif
     cmp    r5, #ATAG_CORE_SIZE        @ is first tag ATAG_CORE? must be first
     cmpne    r5, #ATAG_CORE_SIZE_EMPTY
     bne    1f
     ldr    r5, [r2, #4]
     ldr    r6, =ATAG_CORE
     cmp    r5, r6
     bne    1f
 
 2:    mov    pc, lr                @ atag/dtb pointer is ok  
 
 1:    mov    r2, #0
     mov    pc, lr
 ENDPROC(__vet_atags)

============

@#2:__create_page_tables

============


 __create_page_tables:
     pgtbl    r4, r8                @ page table address

============


 


     ldr    r13, =__mmap_switched        @ address to jump to after
                         @ mmu has been enabled
     adr    lr, BSYM(1f)            @ return (PIC) address
     mov    r8, r4                @ set TTBR1 to swapper_pg_dir
  ARM(    add    pc, r10, #PROCINFO_INITFUNC    )
  THUMB(    add    r12, r10, #PROCINFO_INITFUNC    )
  THUMB(    mov    pc, r12                )
 1:      __enable_mmu

============

进入enable_mmu


 __enable_mmu:
 #if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6
     orr    r0, r0, #CR_A
 #else
     bic    r0, r0, #CR_A
 #endif
 #ifdef CONFIG_CPU_DCACHE_DISABLE
     bic    r0, r0, #CR_C
 #endif
 #ifdef CONFIG_CPU_BPREDICT_DISABLE
     bic    r0, r0, #CR_Z
 #endif
 #ifdef CONFIG_CPU_ICACHE_DISABLE
     bic    r0, r0, #CR_I
 #endif
     mov    r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
               domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
               domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \
               domain_val(DOMAIN_IO, DOMAIN_CLIENT))
     mcr    p15, 0, r5, c3, c0, 0        @ load domain access register
     mcr    p15, 0, r4, c2, c0, 0        @ load page table pointer
       __turn_mmu_on
 ENDPROC(__enable_mmu)

==========


     .align    5
 __turn_mmu_on:
     mov    r0, r0
     mcr    p15, 0, r0, c1, c0, 0        @ write control reg
     mrc    p15, 0, r3, c0, c0, 0        @ read id reg
     mov    r3, r3
     mov    r3, r13      //跳回r13,=__mmap_switched
     mov    pc, r3
 __enable_mmu_end:
 ENDPROC(__turn_mmu_on)

==========

#arch/arm/kernel/head-common.s


     __INIT
 __mmap_switched:
     adr    r3, __mmap_switched_data
 
     ldmia    r3!, {r4, r5, r6, r7}
     cmp    r4, r5                @ Copy data segment if needed
 1:    cmpne    r5, r6
     ldrne    fp, [r4], #4
     strne    fp, [r5], #4
     bne    1b
 
     mov    fp, #0                @ Clear BSS (and zero fp)
 1:    cmp    r6, r7
     strcc    fp, [r6],#4
     bcc    1b
 
  ARM(    ldmia    r3, {r4, r5, r6, r7, sp})
  THUMB(    ldmia    r3, {r4, r5, r6, r7}    )
  THUMB(    ldr    sp, [r3, #16]        )
     str    r9, [r4]            @ Save processor ID
     str    r1, [r5]            @ Save machine type
     str    r2, [r6]            @ Save atags pointer
     bic    r4, r0, #CR_A            @ Clear 'A' bit
     stmia    r7, {r0, r4}            @ Save control register values
       start_kernel
 ENDPROC(__mmap_switched)

===========

 

绝对地址操作,copy data,bss清空,跳入start_kernel,进入c环境。

关键字:linux  启动流程  arm 引用地址:linux启动流程导读(arm为例)

上一篇:S3C2440 SDRAM内存原理
下一篇:arm汇编标号globel和word解释

推荐阅读最新更新时间:2024-03-16 14:52

arm linux 从入口到start_kernel 代码分析 - 7(end)
6. 切换数据 在 arch/arm/kernel/head-common.S 中: 00014: .type __switch_data, %object 00015: __switch_data: 00016: .long __mmap_switched 00017: .long __data_loc @ r4 00018: .long __data_start @ r5 00019: .long __bss_start @ r6 00020: .long _end @ r7 00021: .long processor_id @ r4 00022: .long __mac
[单片机]
基于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>应用程序开发研究
linux内核中的copy_to_user和copy_from_user(二)
linux内核中的copy_to_user和copy_from_user(二) 图解__arch_copy_from_user Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) __arch_copy_from_user函数实现数据的拷贝,当地址没有按4字节对齐,拷贝数据时需要进行字节组合,拷贝大量数据时速度会非常慢。该函数的过程如下图所示。下图有点模糊,大家可以先下载( http://download.csdn.net/detail/ce123/4973958 )到自己电脑再看。
[单片机]
<font color='red'>linux</font>内核中的copy_to_user和copy_from_user(二)
基于ARM的嵌入式多参数监护仪设计与实现
1 引 言 多参数监护仪广泛应用于ICU、CCU、病房、手术室等。目前我国也有自主知识产权的产品,如迈瑞、金科威、金脑人等,但与GE、飞利浦世界先进产品比较,在监测和计算、可靠性、实时性、稳定性、信号变异的处理分析、远程传输等方面都较落后 。嵌入式系统把计算机直接嵌入到应用系统之中,它融合了通信技术和半导体微电子技术,是信息技术IT的最终产品 。因此将嵌入式系统,网络等技术应用于医用监护仪领域,能使多参数监护仪顺应现代医用监护仪市场缩小体积,提高数据处理能力,远程医疗等方面的要求。 本文介绍一种基于ARM的实时监护系统,它将32位RISC结构的ARM内核处理器与实时多任务嵌入式系统相结合,并通过嵌入式TCP/IP协议栈为平台添
[工业控制]
linux内核配置对U盘的支持 (for mini2440)
配置优盘 因为优盘用到了SCSI 命令,所以我们先增加SCSI 支持。在Device Drivers 菜单里面,选择SCSI devicesupport,按回车进入出现菜单,按空格键选择选项–SCSI device support,然后进入选择SCSI disk support,返回Device Drivers 菜单,再选择 USB support,按回车进入USB support 菜单,找到并选中“ * USB Mass Storage support”,另外,现在的优盘等移动存储器使用的大都是FAT/FAT32 格式的,因此我们还需要添加FAT32 文件系统的支持,在内核配置主菜单下依次选择如下菜单项: File syst
[单片机]
<font color='red'>linux</font>内核配置对U盘的支持 (for mini2440)
基于ARM的IEEE802.11bMAC层协议IP核设计
摘要:介绍了IEEE 802.11b MAC层协议IP核设计,提出了基于32位微处理器ARM7DMI的系统设计方案,阐述了系统硬件平台的设计、结构及主要模块单元的功能;给出了利用形式描述语言SDL进行MAC层协议设计开发的完整设计流程;阐述了软件的层次结构,并针对设计中遇到的代码生成器的选择、设计优化、与实时操作系统(RTOS)的集成和环境函数编写等问题进行了深入讨论。 关键词:ARM 802.11, IP 目前各种协议的设计实现,大多数是基于微处理器、微控制器或DSP的嵌入式系统。ARM是ARM公司推出的高性能32位RISC微处理器,具有业界领先的体系结构,被广泛6应用于各种系统设计中。基于ARM的开发通常使用C、C++或
[网络通信]
AMD发布新的P-State EPP驱动 提高Linux环境下的CPU电源效率
AMD公司最近为基于Linux的计算机更新了P-state EPP驱动程序,在CPU电源效率方面提供了良好的提升。该公司正在利用ACPI CPPC能源偏好性能信息来控制CPU的功率,使处理器更加高效并提高性能。 AMD公司的EPP驱动程序的工作原理是采用P-State CPU频率驱动程序,通过ACPI CPP EPP数据扩展其实现,并指导硬件在能源效率和性能之间做出决定。产生低功率水平的固件将估计运行时的频率,再让EPP指示系统的处理器核心频率。 AMD公司提供了在基于Linux的系统内使用AMD EPYC Zen 2 Rome 服务器处理器的这一实施的测试结果。基准测试表明,新的驱动程序在整个几项管理中的性能改善比am
[嵌入式]
Linux开发板上跑一个qt程序的基本步骤
01 前言 学 Linux 不难,难的是没有找对 教程 ,没有人快速的带你。开发板买了之后就放在那里吃灰,看 视频 也看不下去,看文档又看不懂,太难了! 本文以通俗易懂的方式讲一下在正点原子Linux开发板上跑一个qt程序的基本步骤,争取让初学者能够在半天的时间跑通第一个程序。 硬件 :正点原子 Linux mini开发板 软件:win10,vmware,ubuntu,qtcreat or 运行效果如下图所示,就是在正点原子默认的UI界面基础上,运行了一个serialport例程。 先说一下初学Linux 嵌入式开发 的感受,学习 STM32 时 ,熟悉了 Keil 或IAR这个集成开发环境,也可以用简单的 寄存器
[单片机]
在<font color='red'>Linux</font>开发板上跑一个qt程序的基本步骤
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved