通过/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 = 0;
        void *base;
        int fd;

        fd = open("/dev/mem", O_RDWR | O_SYNC);
        if (fd == -1) {
                printf("failed to open /dev/mem!");
                return -1;
        }

        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 = -1;
                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)) == -1) {
                printf("failed to munmap /dev/mem!");
                ret = -1;
        }

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: 12345678

# devmem2 0x10000000
/dev/mem opened.
Memory mapped at address 0xb6f15000.
Value at address 0x10000000 (0xb6f15000): 0x12345678

原文地址:https://www.cnblogs.com/yanceylu/p/12350161.html

时间: 2024-09-29 02:04:30

通过/dev/mem操作物理内存的相关文章

open(&quot;/dev/mem &quot;,O_RDWR | O_SYNC)

[摘要]/dev/mem是物理内存的全映像,可以用来访问物理内存,一般用法是open("/dev/mem",O_RDWR|O_SYNC),然后mmap,接着就可以用mmap的地址来访问物理内存,这实际上就是实现用户空间驱动的一种方法. http://blog.csdn.net/wlp600/article/details/6893636# 1.用户空间驱动优点 有几个论据倾向于用户空间编程,有时编写一个所谓的用户空间设备驱动对比钻研内核是一个明智的选择,用户空间驱动的好处在于: 1.完

/dev/mem可没那么简单

这几天研究了下/dev/mem.发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上.在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料. 网上的说法也非常统一,/dev/mem是物理内存的全映像,能够用来訪问物理内存,一般使用方法是open("/dev/mem",O_RDWR|O_SYNC),接着就能够用mmap来訪问物理内存以及外设的IO资源,这就是实现用户空间驱动的一种方法.用户空间驱动听起来非常酷.可是对于/dev/mem,我认为没那么简

/dev/mem直接操作硬件寄存器

/******************************************************************************* * /dev/mem直接操作硬件寄存器 * 说明: * 在和左栋讨论如何处理iomux的时候,可以直接通过操作/dev/mem进行iomux的pin映射. * * 2017-9-27 深圳 龙华樟坑村 曾剑锋 ****************************************************************

通过/dev/mem只能访问高端内存以下的内核线性地址空间

http://blog.chinaunix.net/uid-20564848-id-74706.html   </proc/iomem和/proc /ioports对应的fops> <浅析pc机上如何将vmlinuz- 2.6.31-14-generic解压出vmlinux> fs_initcall(chr_dev_init); chr_dev_init ==> register_chrdev(MEM_MAJOR,"mem",&memory_fop

/dev/mem和/dev/kmem的区别

/dev/mem 用来访问物理IO设备,比如X用来访问显卡的物理内存,或嵌入式中访问GPIO.用法一般就是open,然后mmap,接着可以使用map之后的地址来访问物理内存.这其实就是实现用户空间驱动的一种方法. /dev/kmem 一般可以用来查看kernel的变量,或者用作rootkit之类的. 访问/dev/mem和/dev/kmem都需要root权限,否则普通用户就可以访问任意物理地址,进而破坏系统. 原文地址:https://www.cnblogs.com/fourstupidguns

WiringPi原理分析

1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的“玩法”.wiringPi是一个简单易用的函数库,通过wiringPi可以扩展SPI和I2C等芯片. 本篇博文将通过一个简单的例子呈现wiringPi的使用,虽然例子简单但会深入分析wiringPi内部实现代码. 2.BCM2835 GPIO相关寄存器 (该部分表述可能有误,正在确认修改中)树莓派平台的GP

访问内存过程小结

     本文总结一下,Linux下面几种访问内存的方式方法.相关资料转载自:Linux 内存与I/O访问      X86体系结构下,内存空间分为I/O空间和内存空间,I/O空间通过特定的指令in.out来访问,内存空间采用mov等指令访问.      arm体系结构下,内存空间和I/O空间统一划分,他们在一个地址空间内.       在处理器和真实的内存空间之间,还有MMU这一神奇的部件存在,它辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射关系转换.内存访问权限保护和cache缓存控

通过devmem访问物理地址

目录 1.写在前面 2.devmem使用 3.应用层 4.内核层 1.写在前面 最近在调试时需要在用户层访问物理内存,发现应用层可以使用devmem工具访问物理地址.查看源码,实际上是对/dev/mem操作,通过mmap可以将物理地址映射到用户空间的虚拟地址上,在用户空间完成对设备寄存器的读写.藉由此原因,想深入理解下mmap的具体实现. 2.devmem使用 devmem的配置,可以在busybox的杂项中找到. CONFIG_USER_BUSYBOX_DEVMEM: devmem is a

Android平台上直接物理内存读写漏洞的那些事

/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: [email protected] */ 通过mmap直接操作物理内存的漏洞应该算是比较常见的一类漏洞了,在2012年.2013年的这段时间里,爆出了好几个物理内存读写相关的漏洞.主要是因为某些设备本身具有mmap物理内存的功能,但是其权限又是全局可读写的,最后,黑客通过精心构造的参数,patch相关函数或者数据结构达到权限提升的目的. 这样的设备主要有以下几个 /dev/exynos-mem CVE-2012-6422