问题现象:

Cortex A5 MPcore寄存器TPIDRPRW复位值不为零,造成Linux Kernel不能启动的问题。

问题原因分析:

由于Linux Kernel内核配置使能了CONFIG_TRACE_IRQFLAGS,内核在跟踪关闭硬件中断行为时(trace_hardirqs_off_caller()),调用内核中__my_cpu_offset()(以汇编指令mrc p15, 0, r2, c13, c0, 4实现)以获取寄存器TPIDRPRW的值来获取当前线程/进程信息时,由于寄存器TPIDRPRW不能被复位和上电复位清零(在FPGA板上表现为复位或上电复位后寄存器TPIDRPRW的值保留上一次设置值,重烧逻辑后寄存器TPIDRPRW值清零),造成内核获取当前线程/进程信息的存储地址是一个非法地址,造成CPU data-abort,从而使用得内核无法正常启动.

问题解决办法:

查看Cortex A5 MPcore手册,手册里描述TPIDRPRW的复位值的地方是一个“-”,手册里没讲-是什么意思,问了一硬件设计人员,说这个寄存器没有复位值,看来应该是内核代码对寄存器TPIDRPRW的理解有误。

研究了半天,没弄清楚应该在内核哪里打补丁,只好在DS-5的启动脚本和bootloader里面打补丁的方法,先处理一下:

在DS-5脚本里添加:

set var $CP15::$System::$CP15_TPIDRPRW = 0x0

在bootloader里添加:

mov r0, #0

mcr p15, 0, r0, c13, c0, 4

问题扩展:

不是很理解为什么ARM在设计Cortex A5 MPcore寄存器TPIDRPRW时设计成没有复位值,从软件使用上来看,CPU已经复位,TPIDRPRW的值就已经完全没有意义了,没有必要保存。

哪位内核开发者有时间给内核打个补丁吧。

4核a5中断linux,Cortex A5 MPcore寄存器TPIDRPRW复位值不为零,造成Linux Kernel不能启动的问题...相关推荐

  1. linux中的SGI(核间中断)IPI_RESCHEDULE详解

    1.SGI中断(核间通信中断) 在gicv2/gicv3中,SGI中断(中断号0-15)是software generate interrupt,用户核间中断. 我们一般将0-7划分给linux中使用 ...

  2. OPPOa5m手机Android,OPPO A5怎么样?OPPO A5手机体验评测

    OPPO A5怎么样?据相关媒体报道,OPPO官方本月初低调的发布了旗下A系列的最新机型--"OPPO A5".那么问题出现了,OPPO A5究竟怎么样?OPPO A5值不值得买呢 ...

  3. Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...

    前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pi ...

  4. 还觉得linux命令难吗,看这篇2w多字的linux命令详解,通俗易懂

    序言  本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了一些日常使用较为频繁的命令进行讲解,但还是免不 ...

  5. linux 多核线程 调度,通过轻型线程提高多核设备中的Linux实时性能

    但请您稍稍考虑一下.采用上文提到的 Linux 实时扩展怎么样?是的,PREEMPT_RT 可以解决 Linux 内核中存在的许多关于响应性的问题,但不能真正解决多线程问题.实施用户空间 Linux ...

  6. 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. arm裸机与嵌入式linux驱动开发,如何编写基于ARM的裸机程序和基于Linux的驱动程序?...

    在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序. ARM架构:Cortex-A9Linux内核:3.14 在讲述ADC之前, ...

  8. Linux音频问题——codec寄存器配置

    一.Linux音频简介 1.Linux音频的历史 起初,在1992年推出了OSS框架,用于在Unix操作系统中处理音频信号.直至于1998年Gravis Ultrasound所开发的ALSA驱动,AL ...

  9. linux系统启动过程详解-开机加电后发生了什么 --linux内核剖析(零)

    本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...

最新文章

  1. makefile多目录多文件
  2. 公众号滑动图代码_实用技巧:公众号封面图如何提取?
  3. Mysql load data local命令详解
  4. pdf 深入理解kotlin协程_协程初探
  5. phoenix timestamp字段查询
  6. 线程中task取消_c#异步编程-Task(一)
  7. [置顶] woff格式字体怎么打开和编辑?
  8. 网上阅卷系统服务器,网上阅卷系统是什么?
  9. WinRAR压缩文件参数详解
  10. Face3D学习笔记(3)3DMM示例源码解析【上】准备工作
  11. LAMMPS实例教程—In文件详解
  12. 树形控件之思维导图 Android
  13. 计算机网络体系结构——各层的功能
  14. orcad的交流分析
  15. Access denied for user 'root'@'localhos
  16. win10计算机怎么新增用户,win10 如何添加管理员账户_win10 添加管理员账户方法-win7之家...
  17. 数字货币期货现货交易技巧,把握关键进场的买入点!(纯干货)
  18. 请插入多卷集的最后一张磁盘,然后单击”确认“继续
  19. kali操作系统+信息搜集工具
  20. 山东大学软件学院数据结构复习题目

热门文章

  1. AES SBox的构造(python)
  2. C#使用oledb操作excel文件的方法
  3. mysqldump 备份命令使用中的一些经验总结
  4. Android AES加密算法及其实现
  5. 【c】正负数二进制表示
  6. [转] Windows完成端口与Linux epoll技术简介
  7. 修改Docker镜像的默认存储位置
  8. mysql 字符串的hash函数_【转载】字符串Hash函数比较
  9. transact和onTransact的区别
  10. xcode6.1中 symbolicatecrash位置