利用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系统调用 ...
随机推荐
- LeetCode题解——Palindrome Number
题目: 判断一个数字是不是回文数字,即最高位与最低位相同,次高位与次低位相同,... 解法: 求出数字的位数,然后依次求商和求余判断是否相等. 代码: class Solution { public: ...
- document.body、document.documentElement和window获取视窗大小的区别
来源:http://www.ido321.com/906.html 在w3school关于window对象的介绍中,介绍了获取浏览器窗口大小的三种方法(浏览器的视口,不包括工具栏和滚动条). 对于In ...
- Probabilistic SVM 与 Kernel Logistic Regression(KLR)
本篇讲的是SVM与logistic regression的关系. (一) SVM算法概论 首先我们从头梳理一下SVM(一般情况下,SVM指的是soft-margin SVM)这个算法. 这个算法要实现 ...
- Tkinter教程之Listbox篇
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811310 #Tkinter教程之Listbox篇#Listbox为列表框控件,它可以包含一个 ...
- mahout 安装
1. 下载mahout-distribution-0.5.tar.gz 并解压: 2.配置环境变量: /etc/profile export MAHOUT_HOME=/home/mahout/ exp ...
- matlab中的字符串数组与函数调用
1, matlab中的字符串就是1维字符数组,即如: a = 'dddssd'; b = 'lsde'; c = [a, b]; 当然也可以: c= strcat(a, b); 2, matlab中的 ...
- 总结:常用的Linux系统监控命令
记录一下自己常用的linux系统命令,方便以后查阅,发觉记忆越来越不行了 找到最耗CPU的java线程 ps命令 命令: ps -mp pid -o THREAD,tid,time 或者 ps -Lf ...
- 简谈HTML5与APP技术应用
HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...
- 通过OAF实现RTF多语言
职责: Oracle XML Publisher 管理员 -->主页 -->模板 -->创建模板 1.定义rtf模板时 在创建模板时,勾选可转换.
- Realsense 提取彩色和深度视频流
一.简要介绍 关于realsense的介绍,网上很多,这里不再赘述,sdk及相关文档可参考realsense SDK,也可参考开发人员专区. 运行代码之前,要确保你已经安装好了realsense的DC ...