利用mmap /dev/mem 读写Linux内存
转载:http://blog.csdn.net/zhanglei4214/article/details/6653568
使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。
以下是我写的一个sample
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/mman.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- int main()
- {
- unsigned char * map_base;
- FILE *f;
- int n, fd;
- fd = open("/dev/mem", O_RDWR|O_SYNC);
- if (fd == -1)
- {
- return (-1);
- }
- map_base = mmap(NULL, 0xff, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x20000);
- if (map_base == 0)
- {
- printf("NULL pointer!\n");
- }
- else
- {
- printf("Successfull!\n");
- }
- unsigned long addr;
- unsigned char content;
- int i = 0;
- for (;i < 0xff; ++i)
- {
- addr = (unsigned long)(map_base + i);
- content = map_base[i];
- printf("address: 0x%lx content 0x%x\t\t", addr, (unsigned int)content);
- map_base[i] = (unsigned char)i;
- content = map_base[i];
- printf("updated address: 0x%lx content 0x%x\n", addr, (unsigned int)content);
- }
- close(fd);
- munmap(map_base, 0xff);
- return (1);
- }
上面的例子将起始地址0x20000(物理地址), 长度为0xff映射出来。 然后就可以像普通数组一样操作内存。
下面是输出结果
address: 0x7f3f95391000 content 0x0 updated address: 0x7f3f95391000 content 0x0
address: 0x7f3f95391001 content 0x0 updated address: 0x7f3f95391001 content 0x1
address: 0x7f3f95391002 content 0x0 updated address: 0x7f3f95391002 content 0x2
address: 0x7f3f95391003 content 0x0 updated address: 0x7f3f95391003 content 0x3
address: 0x7f3f95391004 content 0x0 updated address: 0x7f3f95391004 content 0x4
。。。
我的测试机器是64位机。 该例子将物理地址0x20000映射到了虚拟地址0x7f3f95391000。
首先将当前地址下的内容输出, 然后写入新值。
可以通过 hexedit /dev/mem 验证新值已经写入。
如果想在用户态处理kernel分配的地址可以这么做。 首先用virt_addr = get_free_pages(GFP_KERNEL,
order)分配内存,通过phy_addr = __pa(virt_addr)得到物理地址,然后在用户态将/dev/mem用mmap 映射出来,
offset就是phy_addr, length设为 2^order。 此时就可以在用户态读写内核分配的内存了。
注:该操作需要有root权限。
利用mmap /dev/mem 读写Linux内存的更多相关文章
- /dev/mem直接操作硬件寄存器
/******************************************************************************* * /dev/mem直接操作硬件寄存器 ...
- Linux下直接读写物理地址内存
虚拟 转 物理地址 virt_to_phys( *addr );物理 转 虚拟地址 phys_to_virt( *addr ); 如: unsigned long pProtectVA; phys ...
- Linux内存管理 (9)mmap(补充)
之前写过一篇简单的介绍mmap()/munmap()的文章<Linux内存管理 (9)mmap>,比较单薄,这里详细的梳理一下. 从常用的使用者角度介绍两个函数的使用:然后重点是分析内核的 ...
- /dev/mem可没那么简单
这几天研究了下/dev/mem.发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上.在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料. 网上的说法也非常统一 ...
- /dev/mem可没那么简单【转】
转自:http://blog.csdn.net/skyflying2012/article/details/47611399 这几天研究了下/dev/mem,发现功能很神奇,通过mmap可以将物理地址 ...
- Linux内存管理【转】
转自:http://www.cnblogs.com/wuchanming/p/4360264.html 转载:http://www.kerneltravel.net/journal/v/mem.htm ...
- 通过/dev/mem操作物理内存
/dev/mem设备可以用来访问物理内存.下面一段应用程序的代码,实现了通过/dev/mem对物理内存空间中SRAM1的访问. #include <stdio.h> #include &l ...
- linux下共享内存mmap和DMA(直接访问内存)的使用 【转】
转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...
- Linux内存管理之mmap详解
转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用 ...
随机推荐
- Python十分钟入门
[简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1. Python使用C ...
- Python常用模块的安装方法
http://blog.163.com/yang_jianli/blog/static/161990006201162152724339/
- bfs CCF2016第七次 游戏
// bfs CCF2016第七次 游戏 // 思路: // O(300*100*100) // 直接暴搜 // 注意,同一格同一时间不能经过两次!!! #include <bits/stdc+ ...
- CSS框模型(框模型概述、内边距、边框、外边距、外边距合并)
CSS 框模型概述 CSS 框模型 (Box Model) 规定了元素框处理元素内容.内边距.边框 和 外边距 的方式. 元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景. ...
- virt viewer Usbredir USB重定向
编译virt viewer之前执行的configure命令,是没有使能usb-redir相关的功能,virt viewer是否支持usbredir是完全依赖于spice-gtk的. virt view ...
- typedef typedef struct的使用
typedef通常情况用于声明结构体之类的 1,定义某些便于记忆的结构体或者使现有的类型看上去更加整齐,比如后来因为经常使用而被添加进入c/c++标准头文件的stdint.h typedef sign ...
- C++11 能好怎?
0. 摘要 近期读了一些关于C++11标准的材料. 本篇博客将从新标准的优点.与旧版本的区别和使用方法三个角度,大致介绍我对C++11的认识. C++11标准,原名C++0x, 是03版旧标准的更新. ...
- 软件工程个人作业——Agile Software Development读后感
昨天利用了半天的时间看了下老师给的网页下的8篇文章和一段宣言,将感悟整理为下面的一篇博客. 首先先介绍一下这个网页.记得我们上学期上过一门课叫做面向对象建模方法,在这门课上刘超老师极力推荐的一本教材— ...
- HDU 5832 A water problem (带坑水题)
A water problem 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5832 Description Two planets named H ...
- c语言中register类型的变量
C语言中: 一.register变量 关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中.有以下几点注意的地方. register变量必须是能被CPU寄存器所接受的类型,这通常意味着re ...