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多人,然后我赶紧冲下楼,拿起两个雨衣,消…

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

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

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

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

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

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

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

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

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

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

如何用示波器测量串口波特率

这是前段时间遇到的问题,刚好这里找到了答案,记录下分享给大家。如何确定时基假如要测量的波特率为9600, 则每一比特位的时间为:1/9600 ≈ 104 μs,一般示波器横向上每个大格子里5个小格子,要想看清一比特位一般需要一…

Linux内核工程师是怎么步入内核殿堂的?

上图是公众号冠名参加的篮球赛对我来说,要搞好Linux内核,首先要做的就是买一块Linux开发板,然后就使劲捣鼓。下面是一位大神对于入门Linux内核的看法。以下的「我」不是公众号作者作者:Coly Lihttps://www.zhihu.com/question/304…

时间同步绝对是一个大问题

上图是加班看到的夜景假设A电脑时间和B电脑时间不同,当他们两个电脑的用户在使用电脑的时候就会存在问题,比如A电脑的用户说,我们下午5:00 去打球,然后A电脑到了5:00就去打球了,但是可能这个时候…

Window10彻底卸载应用商店

Window10如何彻底卸载应用商店?Window10应用商店就是一个应用下载平台,我们可以在应用商店中下载各种应用,但是很多用户并不喜欢在Window10应用商店中下载应用,觉得应用商店浪费内存,因此想将应用商店卸载掉&#xff0…

STM32F7xx —— QSPI

STM32F7xx —— QSPI 目录 STM32F7xx —— QSPI 一、QSPI 二、几个重要的函数 三、几个重要的结构 四、QSPI接口设计(仅供参考) 五、QSPI驱动W25Q256 一、QSPI SPI 是 Queued SPI 的简写,是 Motorola公司推出的 SPI 接口的扩展&#xf…

嵌入式、物联网常见通信协议

本文介绍一些常见的嵌入式、物联网通信协议,它们具有不同的性能、通信速率、覆盖范围、功率和内存,而且每一种协议都有各自的优点和或多或少的缺点。其中一些通信协议只适合小型家用电器,而其他一些通信协议则可以用于大型智慧城市项目。物联…

解决T400死机的问题!

终于解决这几天突然出现的t400 vista假死问题! 原来罪魁祸首是 ThinkPad -- Intel Matrix Storage Manager驱动程序(Windows XP/vista 32bit) 此更新在su自动更新里也有 千万别更新 如果不小心更新并出现偶尔假死(现象:鼠标能动,但是不能打开程序所有应用…

网络中路由器的工作原理

大家好,我是情报小哥!01路由器

C++学习(10)

1 //设计运算符重载的复数类2 #include<iostream.h>3 4 class Complex{5 private:6 double real;//实部7 double image;//虚部8 public:9 Complex(){ 10 real0; 11 image0; 12 } 13 Complex(do…

嵌入式真的没前途?

-上图是我的朋友邓总最近在互联网&#xff0c;然后从侧面了解了嵌入式的行业发展&#xff0c;嵌入式是离不开硬件的&#xff0c;但是硬件的话&#xff0c;又不只是靠硬件赚钱&#xff0c;如果硬件做不成一个产品&#xff0c;很难卖一个好价钱&#xff0c;就好比一个好的食材&am…

js for in 遍历对象与数组

遍历对象 let obj {q:9,w:5,e:2,t:7,c:3}//for in 遍历对象 key为对象的属性名称,遍历属性值时用[]操作符访问//通过[]操作符为对象添加属性或访问属性时&#xff0c;属性名称可以是任何字符串。for (let key in obj) {console.log(obj的key:,key, obj的value:,obj[key]);} …

前凸后翘的步进电机调速算法~

[导读] 大家好&#xff0c;我是逸珺。今天想分享一种超级实用的步进电机调速算法&#xff0c;这种算法在步进电机调速方案中可以说是一种非常优异的方案。梯形调速算法 为啥需要设计一个调速算法呢&#xff1f;步进电机不是给多少脉冲就动多少步吗&#xff1f;但是带上负载了就…

CentOS 7.3 系统安装配置图解教程

一、安装CentOS 7.3 CentOS 7.x系列只有64位系统&#xff0c;没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 成功引导系统后&#xff0c;会出现下面的界面 界面说明&#xff1a; Install CentOS 7 # 安装CentOS 7 Test this media & install CentOS …