ARM Linux启动分析headarmv.S内幕

发布者:幸福的家园最新更新时间:2016-06-20 来源: eefocus关键字:ARM  Linux  启动分析 手机看文章 扫描二维码
随时随地手机看文章
__create_page_tables:
      pgtbl  r4, r5           @ page table address
 
      /* Clear the 16K level 1 swapper page table */
      mov        r0, r4
      mov        r3, #0
      add        r2, r0, #0x4000
1:    str        r3, [r0], #4
      str        r3, [r0], #4
      str        r3, [r0], #4
      str        r3, [r0], #4
      teq        r0, r2
      bne        1b
 
      /*
       * Create identity mapping for first MB of kernel to
       * cater for the MMU enable. This identity mapping
       * will be removed by paging_init()
       */
      krnladr r2, r4, r5         @ start of kernel
      add         r3, r8, r2         @ flags + kernel base
      str         r3, [r4, r2, lsr #18]    @ identity mapping
 
      /*
       * Now setup the pagetables for our kernel direct
       * mapped region. We round TEXTADDR down to the
       * nearest megabyte boundary.
       */
      add        r0, r4, #(TEXTADDR & 0xff000000) >> 18 @ start of kernel
      bic        r2, r3, #0x00f00000
      str        r2, [r0]         @ PAGE_OFFSET + 0MB
      add        r0, r0, #(TEXTADDR & 0x00f00000) >> 18
      str        r3, [r0], #4        @ KERNEL + 0MB
      add        r3, r3, #1 << 20
      str        r3, [r0], #4        @ KERNEL + 1MB
      add        r3, r3, #1 << 20
      str        r3, [r0], #4        @ KERNEL + 2MB
      add        r3, r3, #1 << 20
      str        r3, [r0], #4        @ KERNEL + 3MB
 
      /*
       * Ensure that the first section of RAM is present.
       * we assume that:
       * 1. the RAM is aligned to a 32MB boundary
       * 2. the kernel is executing in the same 32MB chunk
       *     as the start of RAM.
       */
      bic        r0, r0, #0x01f00000 >> 18 @ round down
      and        r2, r5, #0xfe000000    @ round down
      add        r3, r8, r2       @ flags + rambase
      str        r3, [r0]
 
      bic        r8, r8, #0x0c       @ turn off cacheable
                                  @ and bufferable bits
代码创建页表目录。首先清空从0xA0004000开始的16K页表项。然后,为了可以访问从0xA0000000开始的内核的1M空间,将该地址对应的页表项赋值。接着映射从TEXTADDR开始的4M的虚拟地址空间,这需要4个页表项。最后,由于SDRAM开始的第一MB的空间存放有启动时的一些参数,所以也需要映射。在这里,该映射和前面的虚拟地址的映射在地址上是相等的。
 
在创建页表目录完成后,代码通过前面主程序的最后一句add pc, r10, #12跳转到实际的CPU的设置子程序__xscale_setup。
__xscale_setup:
   mov        r0, #F_BIT|I_BIT|SVC_MODE
   msr        cpsr_c, r0
   mcr        p15, 0, ip, c7, c7, 0 @ invalidate I, D caches & BTB
   mcr     p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer
   mcr        p15, 0, ip, c8, c7, 0     @ invalidate I, D TLBs
   mcr        p15, 0, r4, c2, c0, 0     @ load page table pointer
   mov        r0,  #0x1f       @ Domains 0, 1 = client
   mcr        p15, 0, r0, c3, c0, 0 @ load domain access register
   mov        r0,  #1          @ Allow user space to access
   mcr        p15, 0, r0, c15, c1, 0    @ ... CP 0 only.
#if CACHE_WRITE_THROUGH
   mov        r0, #0x20
#else
   Mov     r0, #0x00
#endif
   mcr        p15, 0, r0, c1, c1, 0     @ set auxiliary control reg
   mrc        p15, 0, r0, c1, c0, 0     @ get control register
   bic     r0,  r0, #0x0200       @ ......R.........
   bic        r0,  r0, #0x0082       @ ........B.....A.
   orr        r0,  r0, #0x0005       @ .............C.M
   orr        r0,  r0, #0x3900       @ ..VIZ..S........
#ifdef CONFIG_XSCALE_CACHE_ERRATA
   bic        r0,  r0, #0x0004       @ see cpu_xscale_proc_init
#endif
   mov     pc,  lr
主要是操作协处理器,设置页表目录项基地址,对CACHE和BUFFER的控制位进行一些操作。具体大家可以看看介绍ARM编程的书。
 
.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
      mov   r0, r0
      mov   r0, r0
      mov   r0, r0
      mov   pc, lr
 
      .align 5
__mmap_switched:
      adr   r3, __switch_data + 4
      ldmia r3, {r4, r5, r6, r7, r8, sp} @ r2 = compat
                                          @ sp = stack pointer
 
      mov   fp, #0                @ Clear BSS (and zero fp)
1:    cmp   r4, r5
      strcc fp, [r4],#4
      bcc   1b
 
      str   r9, [r6]              @ Save processor ID
      str   r1, [r7]              @ Save machine type
#ifdef CONFIG_ALIGNMENT_TRAP
      orr   r0, r0, #2            @ ...........A.
#endif
      bic   r2, r0, #2            @ Clear 'A' bit
      stmia r8, {r0, r2}       @ Save control register values
      b SYMBOL_NAME(start_kernel)
最后这段代码的作用主要是在进入C函数前先做一些变量的初始化和保存工作。首先清空BSS区域,然后保存处理器ID和机器类型到各自变量地址,接着保存cr_alignment,最后跳转到init/main.c中的start_kernel函数运行。
 
以上介绍的是head-armv.S文件的主要内容和功能,它是linux运行的第一个文件,具有非常重要的意义。很好的阅读该文件,对于我们理解ARM处理器的工作方式有很大的帮助。同时,在许多linux系统的移植工作中,往往需要对该文件透彻的理解。
关键字:ARM  Linux  启动分析 引用地址:ARM Linux启动分析headarmv.S内幕

上一篇:ARM Linux中断机制之中断处理
下一篇:ARM单片机三种中断返回情况的分析与解决

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

arm 驱动linux内核驱动之中断下半部编程
本文部分参考华清远见文档 中断上半部要求执行时间间隔段,所以往往将处理时间较长的代码放在中断下半部来处理 中断下半部的应用:网卡驱动上半部初始化网卡驱动等短时间的事件,下半部收发数据 中断下半部: a, 下半部产生的原因: 1,中断上下文中不能阻塞,这也限制了中断上下文中能干的事 2,中断处理函数执行过程中仍有可能被其他中断打断,都希望中断处理函数执行得越快越好。 基于上面的原因,内核将整个的中断处理流程分为了上半部和下半部。上半部就是之前所说的中断处理函数,它能最快的响应中断,并且做一些必须在中断响应之后马上要做的事情。而一些需要在中断处理函数后继续执行的操作,内核建议把它放在下半部执行。 比如:在linux内核中,
[单片机]
装载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
[单片机]
装载<font color='red'>ARM</font> <font color='red'>Linux</font>内核<font color='red'>启动</font>过程
Xilinx RFSoC凭借先进技术的最佳运用荣膺ARM TechCon创新奖
电子网消息,All Programmable技术和器件的全球领先企业赛灵思公司(Xilinx)今天宣布,其Zynq® UltraScale+™ RFSoC产品线凭借对先进技术的最佳运用在2017年ARM TechCon大会上荣膺创新大奖。Zynq UltraScale+ RFSoC将直接RF数据转换器与FPGA逻辑和多核多处理ARM®子系统完美集成在一起,从而能为无线、有线电视网络接入、测试测量、雷达等高性能RF应用提供完整的RF信号链。基于分立式组件的传统实现方案需要在功能、成本、功耗之间进行取舍平衡,而Zynq UltraScale+ RFSoC则不受这种约束,因为该系列采用先进技术在同一颗芯片上完美集成了模拟和数字功能。单芯
[半导体设计/制造]
拷贝动态库至arm开发板 (tar 打包链接文件)
正常arm的.so文件或者链接文件是不能被考到U盘 会出现 cp: cannot create symbolic link Operation not permitted Filesystem does not support symbolic links 等错误 或丢失 进入动态库目录 1.打包目录下所有文件 tar -chvf XXX.tar ./* 2.拷贝压缩文件至arm开发板 3.解压压缩文件 tar -xvf ./XXX.tar 附: tar -chvf xxx.tar xxx/ -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原
[单片机]
关于汇编ARM指令DCD
数据定义( Data Definition )伪指令 数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。 DCD ( DCDU ) 用于分配一片连续的字存储单元并用指定的数据初始化。 3、 DCD(或DCDU) 语法格式: 标号 DCD (或 DCDU ) 表达式 DCD (或 DCDU )伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。 DCD 也可用 & 代替。 用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。 使用示例: DataTest DCD 4 , 5 , 6 ;分配
[单片机]
ARM-Linux驱动--DM9000网卡驱动分析(二)
硬件平台:FL2440(s3c2440) 内核版本:2.6.35 主机平台:Ubuntu 11.04 内核版本:2.6.39 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/6612623 下面开始分析具体的代码,这里由于使DM9000驱动更容易理解,在不影响基本的功能的前提下,这里将尽可能的简化该驱动(如:去掉该驱动中支持电源管理的功能) 分析该驱动 1、首先看一下该驱动的平台设备驱动的结构体定义 view plainprint? static struct platform_driver dm9000_driver = { .dr
[单片机]
<font color='red'>ARM</font>-<font color='red'>Linux</font>驱动--DM9000网卡驱动<font color='red'>分析</font>(二)
ARM9微控制器的软硬件平台设计
嵌入式应用系统设计包括硬件平台和软件平台两部分。前者是以嵌入式微控制器/微处理器为核心的硬件系统;后者则是围绕嵌入式操作系统构建的软件系统。两者在设计上是密不可分的,并且需要在设计之间进行权衡优化,根据实际应用进行外扩和裁剪。 基于ARM926EJS内核的LPC3180内部集成了丰富的外设资源,为嵌入式系统构建提供了很大的设计空间。本文结合笔者开发LPC3180嵌入式平台的实际经验,将具体介绍该系统的实现、结构组成和实验结果。 1 LPC3180芯片特性介绍 LPC3180是Philips公司新推出的一款ARM9微控制器。它采用90nm工艺技术,片内集成ARM9EJS处理器内核,具有高计算性能、低功耗的特性,这使得在很多对
[单片机]
<font color='red'>ARM</font>9微控制器的软硬件平台设计
基于FA526处理器SoC平台的Linux操作系统实现
引言   智原科技的FIE8100 SoC平台是一种低功耗、便携式视频相关应用开发SoC平台,也可用于基于FA526 CPU的SoC设计验证。   基于FA526的Linux软件开发套件,开发人员可将Linux一2.4.19软件环境在FIE8100平台上安装实现,并完成对平台上所有IP的驱动程序安装和对FA526的内部调试。 FA526介绍   FA526是一颗有着广泛用途的32位RISC处理器。它包括一个同步CPU内核(core)、独立的指令/数据缓存(cache)、独立的指令/数据暂存器(scratchpads)、一个写缓存(write buffer)、一个内存管理单元(memory management unit)和J
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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