通过/dev/mem操作物理内存
/dev/mem设备可以用来访问物理内存。下面一段应用程序的代码,实现了通过/dev/mem对物理内存空间中SRAM1的访问。
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h> #define SRAM1_ADDR 0x10000000 struct test_data {
int32_t val;
}; int main(void)
{
struct test_data *data;
int ret = ;
void *base;
int fd; fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd == -) {
printf("failed to open /dev/mem!");
return -;
} base = mmap(NULL, sizeof(struct test_data), PROT_READ | PROT_WRITE,
MAP_SHARED, fd, SRAM1_ADDR);
if (base == MAP_FAILED) {
printf("failed to mmap /dev/mem!");
ret = -;
goto err_mmap;
} data = (struct test_data *)base; printf("data value: %x\n", data->val);
data->val = 0x12345678;
printf("write: %x\n", data->val); if (munmap(base, sizeof(struct test_data)) == -) {
printf("failed to munmap /dev/mem!");
ret = -;
} err_mmap:
close(fd);
return ret;
}
可以通过devmem命令验证该程序。通过devmem预先把data设置成0xffffffff,然后用该程序把0x12345678写入data,最后用devmem再读取验证。
# devmem2 0x10000000 w 0xffffffff
/dev/mem opened.
Memory mapped at address 0xb6f36000.
Value at address 0x10000000 (0xb6f36000): 0x11111111
Written 0xFFFFFFFF; readback 0xFFFFFFFF # ./a.out
data value: ffffffff
write: # devmem2 0x10000000
/dev/mem opened.
Memory mapped at address 0xb6f15000.
Value at address 0x10000000 (0xb6f15000): 0x12345678
通过/dev/mem操作物理内存的更多相关文章
- /dev/mem可没那么简单
这几天研究了下/dev/mem.发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上.在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料. 网上的说法也非常统一 ...
- /dev/mem可没那么简单【转】
转自:http://blog.csdn.net/skyflying2012/article/details/47611399 这几天研究了下/dev/mem,发现功能很神奇,通过mmap可以将物理地址 ...
- 开辟sys节点用户层直接操作物理地址(比/dev/mem方便)
在调试驱动程序时, 经常要设置主控器寄存器参数或者运行时读取寄存器值debug问题, 每次修改驱动读取寄存器值都要编译一次驱动再insmod, 十分不方便, 哪怕驱动提供一个节点 如dev/mem给应 ...
- /dev/mem直接操作硬件寄存器
/******************************************************************************* * /dev/mem直接操作硬件寄存器 ...
- 利用mmap /dev/mem 读写Linux内存
转载:http://blog.csdn.net/zhanglei4214/article/details/6653568 使用 hexedit /dev/mem 可以显示所有物理内存中的信息. 运用m ...
- 通过/dev/mem只能访问高端内存以下的内核线性地址空间
http://blog.chinaunix.net/uid-20564848-id-74706.html </proc/iomem和/proc /ioports对应的fops> < ...
- /dev/mem同步写不能使用msync的MS_SYNC选项探究
问题 做了个测试板子的程序,里面有一项写铁电的功能,要求写入之后立即断电,重启后校验数据准确性:铁电设计是通过内存地址直接映射的,于是,使用mmap直接映射了/dev/mem文件,自然地写入之后使用m ...
- 短路运算|字符串操作函数|内存mem操作函数
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- C#—Dev XtraTabControl操作总结如动态增加Tab和关闭选项卡方法等
1:显示行号 找到gridview属性 点击事件 CustomDrawRowIndicator private void gridView1_CustomDrawRowIndicator(object ...
随机推荐
- Mysql Innodb cluster集群搭建
之前搭建过一个Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官网上mysql8的还是开发者版本,所以尝试搭建下mysql Innodb cluster集群. MySQL的高 ...
- innobackupex 恢复脚本
此脚本需要与我前几天写的备份脚本配套才能使用 这里也对innobackupex吐槽下,当使用innobackupex进行恢复的时候,必须要清除所有原数据文件,但是一旦恢复失败,则连实例都将丢失,不成功 ...
- No
1.为什么A/D转换前需要采样保持电路,它的基本原理是什么? 因为被取样的信号是动态,随时改变的,而A/D转换需要时间,在这个转换的过程中,信号是变化的,为了弥补A/D转换的时间差,所以需要采样保持. ...
- Linux/UNIX编程:获取指定用户所有正在运行的进程ID和进程名
先用系统函数 `getpwnam` 获得指定用户名的 UID,然后遍历 /proc/ 中所有 PID 目录,如果 /proc/PID/status 中的 UID 是输入用户名对应的 UID 则输出该 ...
- WeChall_Prime Factory (Training, Math)
Your task is simple:Find the first two primes above 1 million, whose separate digit sums are also pr ...
- ELK:收集Docker容器日志
简介 之前写过一篇博客 ELK:日志收集分析平台,介绍了在Centos7系统上部署配置使用ELK的方法,随着容器化时代的到来,容器化部署成为一种很方便的部署方式,收集容器日志也成为刚需.本篇文档从 容 ...
- Excel VBA: 自动生成巡检报表并通过邮件定时发送
目录 环境说明逻辑结构效果说明及截图①.安装SecureCRT②. 自动巡检脚本③. 数据检索并FTP传送④. 安装Excel 2013⑤. 安装Serv-U⑥. 自动生成图表并邮件发送 环境说明 系 ...
- 最简单的windows 10 软路由
因为轻信了 小米路由器3潘多拉固件刷机教程 年前把自己的小米路由器3pro 刷程砖了,然后自己有一台 i5256 的三众小主机,连在电信光猫上,可以拨号,勉强可以用,but 家里的设备那么多尤其手机笔 ...
- Qt中字符串和数值之间的转换
来自<Qt5.9 C++开发指南> 普通数值和字符串之间的转换 一.从字符串转换为数值 QString类从字符串转换为整数的函数有: int QString::toInt(bool *ok ...
- Mac设置Linux免密登陆
利用公钥认证登录 1.创建共钥 输入下面的命令,一路回车 ssh-keygen -t rsa 2.复制公钥到ssh服务器 将上一步生成的id_rsa.pub公钥文件复制到目标服务器对应用户下的~/.s ...