arm linux 从入口到start_kernel 代码分析 - 5

发布者:WanderlustGaze最新更新时间:2016-07-25 来源: eefocus关键字:arm  linux  start_kernel  代码分析 手机看文章 扫描二维码
随时随地手机看文章
4. 调用平台特定的 __cpu_flush 函数

当 __create_page_tables 返回之后

此时,一些特定寄存器的值如下所示:
r4 = pgtbl              (page table 的物理基地址)
r8 = machine info       (struct machine_desc的基地址)
r9 = cpu id             (通过cp15协处理器获得的cpu id)
r10 = procinfo          (struct proc_info_list的基地址)


在我们需要在开启mmu之前,做一些必须的工作:清除ICache, 清除 DCache, 清除 Writebuffer, 清除TLB等.
这些一般是通过cp15协处理器来实现的,并且是平台相关的. 这就是 __cpu_flush 需要做的工作.
       
        在 arch/arm/kernel/head.S中
00091:  ldr r13, __switch_data  @ address to jump to after
00092:       @ mmu has been enabled    
00093:  adr lr, __enable_mmu  @ return (PIC) address    
00094:  add pc, r10, #PROCINFO_INITFUNC           

第91行: 将r13设置为 __switch_data 的地址
第92行: 将lr设置为 __enable_mmu 的地址
第93行: r10存储的是procinfo的基地址, PROCINFO_INITFUNC是在 arch/arm/kernel/asm-offset.c 中107行定义.
        则该行将pc设为 proc_info_list的 __cpu_flush 函数的地址, 即下面跳转到该函数.
        在分析 __lookup_processor_type 的时候,我们已经知道,对于 ARM926EJS 来说,其__cpu_flush指向的是函数 __arm926_setup

       
        下面我们来分析函数 __arm926_setup
       
        在 arch/arm/mm/proc-arm926.S 中:
00391:  .type __arm926_setup, #function
00392: __arm926_setup:
00393:  mov r0, #0
00394:  mcr p15, 0, r0, c7, c7  @ invalidate I,D caches on v4
00395:  mcr p15, 0, r0, c7, c10, 4  @ drain write buffer on v4
00396: #ifdef CONFIG_MMU
00397:  mcr p15, 0, r0, c8, c7  @ invalidate I,D TLBs on v4
00398: #endif
00399:
00400:
00401: #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
00402:  mov r0, #4    @ disable write-back on caches explicitly
00403:  mcr p15, 7, r0, c15, c0, 0
00404: #endif
00405:
00406:  adr r5, arm926_crval
00407:  ldmia r5, {r5, r6}
00408:  mrc p15, 0, r0, c1, c0  @ get control register v4
00409:  bic r0, r0, r5
00410:  orr r0, r0, r6
00411: #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
00412:  orr r0, r0, #0x4000   @ .1.. .... .... ....
00413: #endif
00414:  mov pc, lr       
00415:  .size __arm926_setup, . - __arm926_setup
00416:
00417:  
00423:  .type arm926_crval, #object
00424: arm926_crval:
00425:  crval clear=0x00007f3f, mmuset=0x00003135, ucset=0x00001134

 

第391, 392行: 是函数声明
第393行: 将r0设置为0
第394行: 清除(invalidate)Instruction Cache 和 Data Cache.
第395行: 清除(drain) Write Buffer.
第396 - 398行: 如果有配置了MMU,则需要清除(invalidate)Instruction TLB 和Data TLB

接下来,是对控制寄存器c1进行配置,请参考 ARM926 TRM.

第401 - 404行: 如果配置了Data Cache使用writethrough方式, 需要关掉write-back.
                
第406行: 取arm926_crval的地址到r5中, arm926_crval 在第424行
  
第407行: 这里我们需要看一下424和425行,其中用到了宏crval,crval是在 arch/arm/mm/proc-macro.S 中:

        00053:  .macro crval, clear, mmuset, ucset
        00054: #ifdef CONFIG_MMU
        00055:  .word \clear
        00056:  .word \mmuset
        00057: #else
        00058:  .word \clear
        00059:  .word \ucset
        00060: #endif
        00061:  .endm

        配合425行,我们可以看出,首先在arm926_crval的地址处存放了clear的值,然后接下来的地址存放了mmuset的值(对于配置了MMU的情况)               
       
所以,在407行中,我们将clear和mmuset的值分别存到了r5, r6中

第408行: 获得控制寄存器c1的值
第409行:  将r0中的 clear (r5) 对应的位都清除掉
第410行: 设置r0中 mmuset (r6) 对应的位

第411 - 413行: 如果配置了使用 round robin方式,需要设置控制寄存器c1的 Bit[16]
第412行: 取lr的值到pc中.
而lr中的值存放的是 __enable_mmu 的地址(arch/arm/kernel/head.S 93行),所以,接下来就是跳转到函数 __enable_mmu

关键字:arm  linux  start_kernel  代码分析 引用地址:arm linux 从入口到start_kernel 代码分析 - 5

上一篇:arm linux 从入口到start_kernel 代码分析 - 4
下一篇:arm linux 从入口到start_kernel 代码分析 - 6

推荐阅读最新更新时间:2024-03-16 15:01

ARM程序状态寄存器
ARM体系结构包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器(SPSRs)。备份的程序状态寄存器用来进行异常处理,其功能包括: ─ 保存ALU中的当前操作信息 ─ 控制允许和禁止中断 ─ 设置处理器的运行模式 条件码标志(Condition Code Flags) N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。 在ARM状态下,绝大多数的指令都是有条件执行的。 在Thumb状态下,仅有分支指令是有条件执行的。 控制位 PSR的低8位(包括I、F、T和M )称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。 ─ 中断
[单片机]
ARM mbed平台WIZwiki-W7500使用说明
ARM mbed IDE 是ARM内核微控制器的在线开发工具,其网站是: http://developer.mbed.org 。网站提供了在线编译器,不需要本地安装编译器即可进行开发,因此没有地点、时间和编译器版本的限制,只要有网络随时随地可进行开发。 下面开始使用ARM mbed IDE 进行WIZwiki-W7500的开发。 1. 如图1所示,首先在 developer.mbed.org 上创建一个帐号,在此帐号下可以添加和使用一些在线软件。登陆注册的账号开始使用IDE,如图2所示。 图1 ARM mbed首页 图2 账号登陆后的界面 2. Mbed.org 提供了不同厂商的不同平台,直接选择需要的厂
[单片机]
<font color='red'>ARM</font> mbed平台WIZwiki-W7500使用说明
基于ARM开发板的车辆检测系统控制单元设计
引言 由于交通需求的不断增加,有越来越多的环形感应线圈检测器用于交通检测。这些埋设在道路表面下的线圈可以检测到车辆通过时的电磁变化进而精确地算出交通流量。交通流量是交通统计和交通规划的基本数据,通过这些检测结果可以用来计算占用率(表征交通密度),在使用双线圈模式时还可以提供速度、车辆行驶方向、车型分类等数据,这些数据对于交通管理和统计是极为重要的。通常高速公路车辆检测系统由多通道环形检测单元LD4和控制单元CCU组成,本文采用PHILIPS公司最新推出的ARM7内核微处理器LPC2114设计实现了车辆检测系统控制单元部分,并且和5个LD4环形检测器一起构成10通道高速公路车辆检测系统。 LPC2114和电子硬盘连线示意图
[单片机]
基于<font color='red'>ARM</font>开发板的车辆检测系统控制单元设计
嵌入式linux启动信息完全注释
作者: yut616@sohu.com 摘要 我们在这里讨论的是对嵌入式linux系统的启动过程的输出信息的注释,通过我们的讨论,大家会对嵌入式linux启动过程中出现的、以前感觉熟悉的、但却又似是而非的东西有一个确切的了解,并且能了解到这些输出信息的来龙去脉。 嵌入式linux的启动信息是一个很值得我们去好好研究的东西,它能将一幅缩影图呈现在我们面前,来指导我们更加深入地理解linux内核。 关键字:linux,嵌入式,启动,bootloader 正文 作为一名嵌入系统开发者,你一定遇到过下面的情景: 在某论坛上看到一篇帖子,上面贴着嵌入式linux开发板启动时的有关信息,然后大家在帖子里讨论着这个启动过程中出
[嵌入式]
微软Windows再度拥抱ARM 突破英特尔、AMD双寡头
微软(Microsoft)曾尝试让Windows RT运行ARM(ARM)处理器,最后以失败告终,如今微软再结盟高通(Qualcomm),推出搭载高通ARM架构Snapdragon 835芯片的随时连结PC(Always Connected PC),这等于打破多年来由英特尔(Intel)及AMD(AMD) x86架构盘据的全球PC中央处理器(CPU)市场格局,让这块市场终于出现非x86架构新选择,另也是微软在面临苹果(Apple) iPad入侵NB市场下,借由推常时连网PC以期抵挡来自iPad对企业PC市场的持续入侵。   根据The Motley Fool网站报导,微软于2012年试图让Windows RT支援ARM处理器运行,
[半导体设计/制造]
linux内核中的IS_ERR
在看内核源码的时候,经常会遇到IS_ERR,比如在 linux/arch/arm/kernel/sys_arm.c中 view plain copy print ? asmlinkage int sys_execve(char __user *filenamei, char __user * __user *argv, char __user * __user *envp, struct pt_regs *regs) { int error; char * filename; filename = getname(filenamei); err
[单片机]
arm7 LPC2103 中断的处理方法
向量中断控制器(VIC)具 有 32 个中断请求输入,可将其编程分为3 类:FIQ 、向量IRQ和非向量IRQ 。可编程分配机制意味着不同外设的中断优先级可以动态分配并调整。 快速中断请求(FIQ )要求具有最高优先级。如果分配给 FIQ 的请求多于1 个,VIC 将中断请求“相或”后向ARM处理器产生 FIQ 信号。当只有一个中断被分配为 FIQ 时可实现 最短的FIQ 等待时间,因为FIQ 服务程序只要简单地启动器件的处理就可以了。但如果分配给FIQ 级的中断多于1 个,FIQ 服务程序从 VIC 中读出一个字来识别产生中断请求的 FIQ中断源是哪一个。 向量IRQ 具有中等优先级。该级别可分配32 个请求中的
[单片机]
IAR推出新版IAR Embedded Workbench for Arm功能安全版,该版本配备经过认证的静态代码分析功能
IAR推出新版IAR Embedded Workbench for Arm功能安全版,该版本配备经过认证的静态代码分析功能 瑞典乌普萨拉,2024年2月20日 – 全球领先的嵌入式系统开发软件解决方案供应商IAR宣布 :推出其旗舰产品IAR Embedded Workbench for Arm功能安全版的最新版本9.50.3。此次发布进一步加强了IAR支持开发人员创建安全、可靠和符合标准的嵌入式应用程序的承诺,涵盖了汽车、医疗设备、工业自动化和消费电子等多个行业。该版本中最重要的新功能是经过认证的C-STAT,这是专为安全关键应用程序设计的静态代码分析工具。 IAR Embedded Workbench for Ar
[嵌入式]
IAR推出新版IAR Embedded Workbench for <font color='red'>Arm</font>功能安全版,该版本配备经过认证的静态<font color='red'>代码</font><font color='red'>分析</font>功能
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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