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.

相关文章推荐

ARMv8 Linux内核head.S源码分析

ARMv8 Linue 内核Head.S主要工作内容: 1、 从el2特权级退回到el1 2、 确认处理器类型 3、 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4、 验证设备树的地址是...

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

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

Linux启动过程分析(head.s)

/********判断内核是否支持硬件并启动MMU************/         bl         __lookup_processor_type        ...

Davinci DM6446 Linux 内核分析——head.S(二)

源地址:http://bbs.ivsok.com/blog-2-9.html //内核CPU初始化 /*  * linux/arch/arm/kernel/head.S  *  * ...
  • sydjm
  • sydjm
  • 2011-12-05 14:26
  • 441

arm-linux head.S 源代码分析

arm-linux head.S 源代码分析这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令...

ARM架构内核启动分析-head.S(1.1、vmlinux.lds 链接脚本分析)

ARM架构内核启动分析 一、start kernel之前 首先需要明确的是,内核镜像在被解压之后执行,是执行哪段代码,这是个重要的问题,平时在编译生成应用程序或内核模块时,我们无需考虑链接的具体细节,...

head.s 分析

linux/arch/arm/boot/compressed/head.S 这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到...

解压缩:arch/arm/boot/compressed/head.S分析

这几天因为工作原因,升级 2.6.22.7 的kernel 到 Mavell 的arm 板子上去,遇到一些头疼的问题, 不得不分析启动代码, 郁闷阿。   zImage是ARM Linu...

Linux-0.01 引导代码分析-head.s

head.s 通过编译链接的处理,同时被 boot.s 加载到保护模式零地址开始运行,在最后会调 /* * head.s contains the 32-bit startup code. ...

linux非解压代码的启动过程分析 unicore head.S vmlinux解压后的代码运行 临时MMU的建立

我们首先看看内核的生成过程: 非压缩内核映象由 make Image 命令产生。其生成过程是: (1) 内核的各个模块经过编译,链接,在内核源代码的顶层目录下生成 vmlinux 文件,这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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