Head_armv.S分析

转载 2006年05月29日 17:30:00

3.1 说明

    这个文件是arch/arm/kernel/head-armv.S,用汇编代码完成,是内核最先执行的一个文件。这一段汇编代码的主要作用,是检查cpu idarchitecture number,初始化页表、cpubbs等操作,并跳到start_kernel函数。它在执行前,处理器的状态应满足:

l        r0      - should be 0

l        r1      - unique architecture number

l        MMU     - off

l        I-cache - on or off

l        D-cache – off

3.2 流程

3.3 代码详细注释

    (略去一些条件编译的代码)

-------------------------------------------------------------------------------------------------------------------

/*

 * We place the page tables 16K below TEXTADDR.  Therefore, we must make sure

 * that TEXTADDR is correctly set.  Currently, we expect the least significant

 * "short" to be 0x8000, but we could probably relax this restriction to

 * TEXTADDR > PAGE_OFFSET + 0x4000

 *

 * Note that swapper_pg_dir is the virtual address of the page tables, and

 * pgtbl gives us a position-independent reference to these tables.  We can

 * do this because stext == TEXTADDR

 *

 * swapper_pg_dir, pgtbl and krnladr are all closely related.

 */

#if (TEXTADDR & 0xffff) != 0x8000

#error TEXTADDR must start at 0xXXXX8000

#endif

 

              .globl      SYMBOL_NAME(swapper_pg_dir)

              .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x4000

 

              .macro    pgtbl, reg, rambase

              adr   /reg, stext

              sub  /reg, /reg, #0x4000

              .endm

 

/*

 * Since the page table is closely related to the kernel start address, we

 * can convert the page table base address to the base address of the section

 * containing both.

 */

              .macro    krnladr, rd, pgtable, rambase

              bic   /rd, /pgtable, #0x000ff000

              .endm

 

/*

 *  Kernel startup entry point.

 *

 * The rules are:

 *  r0      - should be 0

 *  r1      - unique architecture number

 *  MMU     - off

 *  I-cache - on or off

 *  D-cache - off

 *

 * See linux/arch/arm/tools/mach-types for the complete list of numbers

 * for r1.

 */

              .section ".text.init",#alloc,#execinstr

              .type       stext, #function

ENTRY(stext)  //内核入口点

              mov r12, r0  //r00r120

mov r0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode//程序状态,禁止FIQIRQ,设定Supervisor模式。0b11010011

              msr  cpsr_c, r0                    @ and all irqs disabled//置当前程序状态寄存器

              bl     __lookup_processor_type//跳转到判断cpu类型,查找运行的cpuid值,和

//linux编译支持的id值,是否有相等

              teq   r10, #0                         @ invalid processor?//没有则跳到__error

              moveq     r0, #'p'                  @ yes, error 'p'

              beq  __error

              bl     __lookup_architecture_type//跳转到判断体系类型,看r1寄存器的

//architecture number值是否支持。

              teq   r7, #0                           @ invalid architecture? //不支持,跳到出错

              moveq     r0, #'a'                  @ yes, error 'a'

              beq  __error

              bl     __create_page_tables//创建核心页表

              adr   lr, __ret                 @ return address//lr=0xc0028054

              add  pc, r10, #12      @ initialise processor//r10pointer to processor structure

                                                                             //__arm720_proc_info

                                                                             //r1012__arm720_setup;见

//__arm720_proc_infoproc-arm720.S

__arm720_setup: mov  r0, #0

                   mcr   p15, 0, r0, c7, c7, 0            @ invalidate caches

                   mcr   p15, 0, r0, c8, c7, 0            @ flush TLB (v4)

                   mcr   p15, 0, r4, c2, c0                 @ load page table pointer

//cp15寄存器1(ttb)0xc0024000

                   mov  r0, #0x1f                     @ Domains 0, 1 = client

                   mcr   p15, 0, r0, c3, c0                 @ load domain access register

 

                   mrc   p15, 0, r0, c1, c0                 @ get control register//r00x70

                   bic    r0, r0, #0x0e00                            @ ..V. ..RS BLDP WCAM//bit[11:9]=0

                                                                                                                                   r00x00000070

                   orr    r0, r0, #0x2100                            @ .... .... .111 .... (old) //r00x00002170

                   orr    r0, r0, #0x003d                            @ ..1. ..01 ..11 1101 (new) //r00x0000217d

其中S  LDPWC  M位置1

(详见cp15寄存器1说明)

                                                                                                                        

                   mov  pc, lr                                     @ __ret (head-armv.S)

                                                 @ (return control reg)

.type       __switch_data, %object

__switch_data:       .long       __mmap_switched

              .long       SYMBOL_NAME(__bss_start)

              .long       SYMBOL_NAME(_end)

              .long       SYMBOL_NAME(processor_id)

              .long       SYMBOL_NAME(__machine_arch_type)

              .long       SYMBOL_NAME(cr_alignment)

              .long       SYMBOL_NAME(init_task_union)+8192

 

              .type       __ret, %function

__ret:             ldr   lr, __switch_data

              mcr p15, 0, r0, c1, c0//更新控制寄存器cp15寄存器10x0000217d

 

              mov r0, r0

              mov r0, r0

              mov r0, r0

              mov pc, lr//__switch_data

 

              /*

               * This code follows on after the page

               * table switch and jump above.

ARM Linux启动分析----head-armv.S内幕

作者:谷丰,您可以通过gufeng77@126.com和他联系转载请包含以上内容Linux启动后执行的第一个文件是arch/arm/kernel下的head-($PROCESSOR).S文件,proc...
  • force_eagle
  • force_eagle
  • 2007年11月02日 14:15
  • 5336

转载 Head_armv.S分析

说明    这个文件是arch/arm/kernel/head-armv.S,用汇编代码完成,是内核最先执行的一个文件。这一段汇编代码的主要作用,是检查cpu id,architecture numb...
  • kyokyxxj
  • kyokyxxj
  • 2008年09月02日 22:12
  • 245

DUMP文件分析2:一个最简单的DUMP分析示例

本节开始,我将在示例中给大家讲述基本的DUMP文件分析方法。读者应该对Windows系统比较了解,同时比较熟悉Windbg。 本节的示例非常简单,也非常经典,就是常常会遇到的访问空指针。Window...
  • hustd10
  • hustd10
  • 2016年07月30日 21:53
  • 8877

如何进行堆栈分析

1.平常会遇到程序卡的时间很久,不知道shenm
  • hekang1011
  • hekang1011
  • 2014年09月24日 23:09
  • 902

陶哲轩实分析-第3章-集合论-4-6

陶哲轩实分析笔记与习题答案
  • buck84
  • buck84
  • 2016年05月08日 20:48
  • 1046

浅谈Core文件分析

由于计算机程序问题的发生是随机的,为了给定位问题提供一个接口,一些人发明了在发生问题后将内存中的进程相关信息格式化地保存在一个文件中的手段,以便于在发生问题而中断了进程的执行后,通过内存信息转储文件得...
  • fan9511
  • fan9511
  • 2014年07月23日 14:05
  • 1383

指南:分析类

分析类分析类代表“系统中具备职责和行为的事物”的初期概念模型。这些概念模型最终将演进为设计模型中的类和子系统。主题分析类的构造型 边界类 控制类 实体类 关联关系限制 边界类限制 控制类限制 实体类限...
  • luckisok
  • luckisok
  • 2005年10月14日 21:33
  • 2519

次成分分析MCA

简单介绍神经网络次成分分析MCA
  • wtt561111
  • wtt561111
  • 2016年01月26日 16:41
  • 434

Oracle-表分析和索引分析解读

概述当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息。 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这...
  • yangshangwei
  • yangshangwei
  • 2016年12月01日 23:16
  • 7270

深入分析JVM逃逸分析对性能的影响

逃逸分析(Escape Analysis)逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可...
  • jijianshuai
  • jijianshuai
  • 2017年06月26日 14:53
  • 478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Head_armv.S分析
举报原因:
原因补充:

(最多只允许输入30个字)