内核调试之devmem直接读写寄存器

内核调试之devmem直接读写寄存器本文介绍了 Linux 内核调试工具 devmem 的使用方法 包括如何直接读写物理地址的寄存器 以及内核配置中启用 dev mem 的步骤

大家好,欢迎来到IT知识分享网。

今天分享一个内核调试实用工具——devmem。

相信很多做底层驱动的人都会经常用到。

什么是devmem?

在Linux系统,如果我们想要访问某个寄存器,就需要写一个驱动程序,在驱动中映射寄存器地址,转为虚拟地址后就可以访问。

但有时候,我们只是单纯想知道某个寄存器的值,不想这么麻烦,怎么办呢?

Linux早就想到这一点了,于是提供了一个工具devmem,通过devmem就可以直接读写寄存器,

devmem是一个命令,在shell中输入devmem命令就可以非常方便的读写寄存器。

如何使用devmem?

devmem命令格式:

Usage: devmem ADDRESS [WIDTH [VALUE]] Read/write from physical address ADDRESS Address to act upon WIDTH Width (8/16/...) VALUE Data to be written 

ADDRESS:物理地址

WIDTH:位宽,32位、64位等等

VALUE:要写入的值

例如,读取32位0x寄存器的值:

devmem 0x 32 

向32位0x寄存器写入0x

devmem 0x 32 0x 

内核配置devmem

devmem命令依赖于/dev/mem设备节点,需要在Linux内核中打开/dev/mem的配置:

Device Drivers ---> Character devices ---> [*] /dev/mem virtual device support 

在这里插入图片描述

Linux应用层操作寄存器

除了直接使用devmem,我们也可以在Linux应用层自己实现一个devmem。

devmem的实现原理,就是打开/dev/mem,然后通过mmap映射物理地址,从而实现读写寄存器。因此,我们只要实现这些操作,就可以自己实现类似devmem的功能。

例如,在Linux应用层读取物理地址为0x的值:

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <fcntl.h> #include <unistd.h> #include <sys/mman.h> #define MAP_SIZE 0x80000 #define base 0x int main(int argc, char **argv) { 
     int fd = open("/dev/mem",O_RDWR|O_NDELAY); if (fd < 0) { 
     printf("open /dev/mem error!\n"); return -1; } void *map_base = mmap(NULL,MAP_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,base); if (map_base == MAP_FAILED) return -1; printf("%x \n",*(volatile unsigned int*)(map_base)); close(fd); munmap(map_base,MAP_SIZE); return 0; } 

总结

devmem是一个很常用的工具,主要给驱动开发人员在Linux应用层调试使用。devmem不仅仅是访问寄存器,只要有权限访问某个物理地址,就可以使用devmem,方便我们调试。

原文链接: 内核调试之devmem直接读写寄存器


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112912.html

(0)
上一篇 2026-01-15 12:26
下一篇 2026-01-15 12:46

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信