当前位置: 首页 > news >正文

/dev/mem 原理及使用

0.参考

https://blog.csdn.net/qq_41684737/article/details/153332112

https://blog.csdn.net/liyucheng987/article/details/109163577

https://cloud.tencent.com/developer/article/1543163

1.原理

其实原理部分我也是看的上述几个参考文献中的描述,具体不再展开,总之需要知道/dev/mem这个字符设备是linux给用户提供的一个接口,让用户可以读写系统的物理内存。本篇还是以使用这个工具为主。

2.使用--读写内存

机器中存在/dev/mem这个设备的前提是kernel必须打开config,主要是前两个:

本次使用/dev/mem访问系统中的GIC寄存器,当然/dev/mem的用途不止这一种,首先就是撰写用户程序,我的如下:

/** devmem.c: Simple program to read/write from/to any location in memory.*/#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>
#include <ctype.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/mman.h>#define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)int main(int argc, char **argv) {int fd, len;void *map_base;unsigned char* virt_addr; unsigned long read_result, writeval;off_t target;if(argc < 2) {fprintf(stderr, "\nUsage:\t%s { address } { len } [ data ]\n""\taddress : memory address to act upon\n""\tlen     : access length : [1/4/8/16]byte \n""\tdata    : data to be written\n\n",argv[0]);exit(1);}target = strtoul(argv[1], 0, 0);len = strtoul(argv[2], 0, 0);if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;printf("/dev/mem opened.\n"); fflush(stdout);/* Map one page 先以页对齐*/map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);if(map_base == (void *) -1) FATAL;printf("Memory mapped at address %p.\n", map_base); fflush(stdout);//加上页内offset,获得地址virt_addr = (unsigned char*)map_base + (target & MAP_MASK);// 读取内存内容printf("Reading from physical address 0x%08x:\n", target);for (int i = len-1; i >=0; i--) {	//逆向输出,从高位到低位printf("%02x ", virt_addr[i]);}printf("\n");//写地址if(argc > 3) {writeval = strtoul(argv[3], 0, 0);for(int i = 0; i < len; i++) {virt_addr[i] = (writeval >> i*8) & 0xFF;}printf("Written 0x%X to target 0x%X\n", writeval, target); fflush(stdout);//readbackprintf("Reading After Write from physical address 0x%08x:\n", target);for (int i = len-1; i >=0; i--) {   //逆向输出,从高位到低位printf("%02x ", virt_addr[i]);}printf("\n");}if(munmap(map_base, MAP_SIZE) == -1) FATAL;close(fd);return 0;
}

编译程序就是最简单的gcc,然后运用devmem程序读写指定地址的内存即可。

本次是读写GIC中断控制器的GICR_ISENABLE0寄存器,偏移为GICR_BASE+GICR_SGI+offset = GICR_BASE + 0x10000 + 0x100处,其中GICR_BASE的地址可以通过ACPI表或dmesg获取。实验中受限于GIC寄存器本身的修改权限,有些字段写的并不成功。

http://www.dtcms.com/a/511997.html

相关文章:

  • 机关网站建设 方案泰安新闻完整版
  • Endpoint
  • 阿里巴巴双11微服务智能监控体系:从全链路追踪到AI自愈的技术实践
  • 在ros2 humble版本上安装D455相机并获取图像和深度信息
  • C++DirectX9坐标系与基本图元之渲染状态(RenderState)_0304
  • 网站建设app长春seo技术
  • 【C++】力扣hot100错误总结
  • C++中的vector讲解
  • 笔记【字符串,转义字符,注释】
  • visual studio安装本地帮助手册
  • 北京市基础建设质量监督局网站wordpress 插件怎么看
  • 大模型技术分析与演进逻辑
  • 苏州模板网站建站长沙网站建设推广
  • 从零起步学习MySQL || 第六章:MySQL数据库中的一条数据是如何存储的?(结合源码深度解析)
  • 微信小程序页面配置,基本语法,页面切换,tabbar全局配置
  • 数据结构 07
  • 18.基本的ACL
  • 网站后台编程语言创业中文网站模板
  • 从“刘易斯拐点”到“骑手拐点”,即时零售3.0时代还有多远?
  • 有没有一种app类似网站建设开发定制软件开发
  • 沈阳网站建设建设公司普洱网站建设
  • 蓝桥杯题库——部分简单题题解(Java)
  • 新民电商网站建设程序wordpress淘宝发货插件
  • 多服务隔离部署jenkins自动化脚本:从构建到上线的全流程保障
  • React JSX完全指南
  • CSS进阶 | 不用一行JS!用纯CSS打造会动的现代化单页应用(3D翻转卡片)
  • 云栖重磅|瑶池数据库:从云原生数据底座向“AI就绪”的多模态数据底座演进
  • LeetCode 410.分割数组的最大值
  • python批量读取word表格写入excel固定位置
  • 区块链知识总结