Kernel中如何操作CPU及外设寄存器

01

ARM Coretex-A9寄存器

对于ARM Coretex-A9处理器而言其寄存器主要包括两大部分,分别是通用寄存器以及系统控制寄存器。

上图所示的通用寄存器,主要是在代码运行过程中使用到,CPU通过该部分寄存器执行代码并完成相关的运算操作。对于调试过程中比较关心的是SP、LR、PC以及R0~R3几个寄存器。而其他寄存器在特定场景下也有应用,例如U-Boot在代码重定向的过程中使用到了R9寄存器来暂存gd_t的地址。调试过程中,当代码崩溃的时候我们第一步是看PC是多少,以此通过追踪反汇编文件来定位到具体的指令处。

对于系统控制寄存器而言,其实现了CPU的一些控制以及状态指示等功能,例如通过ACTLR寄存器完成多核的配置,通过CPSR寄存器实现CPU的逻辑运算状态指示等。CP15寄存器一共是16组寄存器,通过MRC/MCR指令并结合不同的指令码实现寄存器的访问。

MRC和MCR指令如下图所示:

CPU的取指、运算过程如下图所示,除了要操作内存之外,内部的寄存器组也会同步进行更新。


02

调试工具操作CPU寄存器

在芯片开发验证的过程中,不可避免的会遇到CPU内部逻辑实现异常而导致代码无法正常得到执行,此时需要定位故障的原因,一般可以通过JLINK、DSTREAM工具获取、操作CPU的寄存器。对于程序已经执行出错的场景而JTAG仍然可以连接上的场景,使用JLINK工具可以获取到故障现场信息。JLINK连接上之后输入Regs命令,可以dump出CPU的寄存器值:

当希望改写CPU通用寄存器的时候,可以通过wreg来实现:

同样,CP15寄存器也可以操作:


03

C代码中内嵌汇编

当通过故障现场不能得知故障原因的时候,需要追踪CPU执行过程中寄存器的变化状态,例如Kerne的用户空间程序申请页表的过程中,我们可以通过CP15的ttbr0寄存器获取页表地址。

 1#define _ARM_MRC(coproc, opcode1, Rt, CRn, CRm, opcode2)        \2    asm volatile ("mrc p" #coproc ", " #opcode1 ", %[output], c" #CRn ", c" #CRm ", " #opcode2 "\n" : [output] "=r" (Rt))3#define _ARM_MCR(coproc, opcode1, Rt, CRn, CRm, opcode2)        \4    asm volatile ("mcr p" #coproc ", " #opcode1 ", %[input], c" #CRn ", c" #CRm ", " #opcode2 "\n" :: [input] "r" (Rt))56void func1(void)7{8        u32 ttbr0,ttbr1;9        _ARM_MRC(15, 0, ttbr0, 2, 0, 0);
10        _ARM_MRC(15, 0, ttbr1, 2, 0, 1);
11        printk("ttbr0 0x%08x ttbr1 0x%08x\n", ttbr0, ttbr1);
12}

对于其他寄存器的操作,U-Boot中\arch\arm\include\asm\system.h的代码可以借鉴,通过移植该部分代码可以实现我们的需求:

 1static inline unsigned int get_cr(void)2{3    unsigned int val;45    if (is_hyp())6        asm volatile("mrc p15, 4, %0, c1, c0, 0 @ get CR" : "=r" (val)7                                  :8                                  : "cc");9    else
10        asm volatile("mrc p15, 0, %0, c1, c0, 0 @ get CR" : "=r" (val)
11                                  :
12                                  : "cc");
13    return val;
14}
15
16static inline void set_cr(unsigned int val)
17{
18    if (is_hyp())
19        asm volatile("mcr p15, 4, %0, c1, c0, 0 @ set CR" :
20                                  : "r" (val)
21                                  : "cc");
22    else
23        asm volatile("mcr p15, 0, %0, c1, c0, 0 @ set CR" :
24                                  : "r" (val)
25                                  : "cc");
26    isb();
27}

04

devmem

对于kernel已经挂在文件系统之后,操作外设寄存器的方法有很多,但是比较倾向于使用devmem这个命令,该命令可以直接操作物理内存空间,不必考虑虚拟地址和物理地址之间的映射。该命令由busybox提供,通过配置busybox可以在生成的文件系统中包含它。

通过devmem操作寄存器的过程如下


END


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识设计模式(装饰者模式)

前言:总结这两天学到的装饰者模式,并用java小小的实现一下。书中有写到:给爱用继承的人一个全新的设计眼界。(ps,本文最后有个小问题待解决) 什么是装饰者模式(Decorator Pattern)&a…

帮一个读者解锁手机

昨天晚上,深圳下了好大好大的雨,我还在加班的时候,小云就发消息说家里打雷很大,到了十点多,我打开手机准备打车,发现打车排队有800多人,然后我赶紧冲下楼,拿起两个雨衣,消…

STM32F7xx —— 96位唯一ID

STM32F7xx —— 96位唯一ID // 配置单片机型号 对外只有这个宏CONFIG_SYSTEM_HARDWARE_TYPE #define CONFIG_SYSTEM_HARDWARE_TYPE SOC_TYPE_STM32F7// SOC类型 typedef enum {SOC_TYPE_STM32F0,SOC_TYPE_STM32F1,SOC_TYPE_STM32F2,SOC_TYPE_STM32F3,SOC_TYPE_STM32F4,SOC_TY…

我喜欢这样的老大[10-24]

据说原图是奥巴马和一个小朋友打雪仗,下面的图片是众多恶搞作品中的一个。也是我最喜欢的一个,因为总统先生可爱,猫更可爱。。。。我喜欢这样的老大,一把年纪了还保有童真非常难得;作为一位总统,愿意把童真…

知识点:Mysql 数据库索引优化实战(4)

知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插入订单数据,为了避免重复导单…

看漫画学电子,非常精彩!有些概念以前模糊现在真的懂了

来源:gadgetronicx.com,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)1、按键消抖,在机械按键断开与闭合时,按键的触电是有一点弹性的,按下去的时候不会马上…

STM32F7xx —— 串口通信

STM32F7xx —— 串口通信 目录 STM32F7xx —— 串口通信 一、串口初始化过程 二、几个重要的串口函数 三、几个重要的结构 四、基本接口设计 一、串口初始化过程 1、时钟使能; 2、GPIO初始化; 3、串口波特率设置; 4、串口控制&#…

一个跳楼博士生的遗书:这个世界是一沟绝望的死水

o(︶︿︶)o 唉北邮跳楼博士生给母亲堵塞遗书:这个世界是一沟绝望的死水 这个世界是一沟绝望的死水,我在这里再怎么折腾也激不起半点涟漪。所有的努力都会被既得利益集团踩在脚下,所有的奋斗都面临着举步维艰。冷漠的人,谢谢你…

jquery插件课程1 幻灯片、城市选择、日期时间选择、拖放、方向拖动插件

jquery插件课程1 幻灯片、城市选择、日期时间选择、拖放、方向拖动插件 一、总结 一句话总结:都是jquery插件,都还比较小,参数(配置参数、数据)一般都是通过json传递。 1、插件配置数据或者参数的时候用的是什么数据结…

由c语言转向c++,我们需要做什么?

点击上方蓝字添加关注在此送大家一份小礼物,公众号内回复linux0001即可获得一本Linux电子教程“c语言和c到底有什么不同和联系呢?”毫无疑问,c语言和c是两种不同的语言,但是又有着千丝万缕的联系。语法上c语言与c一脉相承&#xf…

黄聪:【强烈推荐】搜索引擎排名决定一切吗!

在点石看到一篇《搜索引擎排名决定一切么》,作者cqqc626。写的太赞的,Kyw看后都有点激动,希望天下所有要需要SEO服务的客户们,都能明白其中道理,明白排名不是一切。正文如下: 前段时间经常看到很多和自己差…

STM32F7xx —— CAN通信

STM32F7xx —— CAN通信 目录 STM32F7xx —— CAN通信 一、CAN基础 二、几个重要的CAN函数 三、几个重要的结构 四、接口设计 一、CAN基础 差分信号:显性电平对应逻辑0,CAN_H和CAN_L差为2.5V;隐形电平对应逻辑1,CAN_H和CAN_…

[leetcode] 14. 最长公共前缀

14. 最长公共前缀 超级简单。。。 class Solution { public:string longestCommonPrefix(vector<string> &strs) {if (strs.size() 0) {return "";}string common strs[0];for (int i 1; i < strs.size(); i) {common findCommon(strs[i], common);…

Cmake确实应该用到的时候再学

最近在做项目用到Cmake相关的知识&#xff0c;之前做的是BSP驱动开发&#xff0c;基本用不到Cmake&#xff0c;唯一和Cmake有交集的应该是我们移植网关项目&#xff0c;不过也只是修修改改&#xff0c;直到最近用到Cmake开发项目&#xff0c;才真正是接触了这个东西。前天加载一…

手机吞吃蛇游戏的设计与开发

为什么80%的码农都做不了架构师&#xff1f;>>> J2ME(Java 2 Micro Edition) 是近年来随着各种不同设备&#xff0c;尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上&#xff0c;对设备的智能化、www.21cnlunwen.com Write…

STM32F7xx —— 内部flash

STM32F7xx —— 内部flash 这个就没什么好说的了&#xff0c;直接上代码了&#xff0c;主要封装了三个函数&#xff0c;擦除&#xff0c;写flash&#xff0c;读flash。 // STM32F767IGT6: 1M flash // STM32F767ZIT6: 2M flash #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x…

深入理解 Vue Computed 计算属性

Computed 计算属性是 Vue 中常用的一个功能&#xff0c;我们今天来说一下他的执行过长 拿官网简单的例子来看一下&#xff1a; <div id"example"><p>Original message: "{{ message }}"</p><p>Computed reversed message: "{…

vscode 使用 ssh 登录

// 执行 // 使用你自己的服务器IP与登录账户 export USER_AT_HOST"服务器账户名服务器IP" // PUBKEYPATH是你公钥的路径 export PUBKEYPATH"$HOME/.ssh/id_rsa.pub"ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST"

SNMP4J的一点缺陷

最近在使用SNMP4J的过程中发现一个缺陷&#xff0c;不知道应不应该算是个bug&#xff0c;但我想终究算是一个不完善的地方。 问题描述如下&#xff1a; 在通过SNMP4J去获取某些交换机上的MAC地址转发表(dot1dTpFdbTable, OID为1.3.6.1.2.1.17.4.3&#xff09;时&#xff0c;发现…

3-3 数数字

算法入门经典 P57 把前n&#xff08;n<100000&#xff09;个整数顺序写在一起&#xff0c;123456789...数一数0-9各出现多少次。 #include<stdio.h>#include<string.h>#include "stdafx.h"#include "iostream" #include <string&…