Head_armv.S分析

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, #0x 1f                      @ 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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值