参考链接:http://zhuhaibobb.blog.163.com/blog/static/2744006720101049030606/

Linux内核提供了/dev/mem驱动,提供了一种直接访问内存物理地址的方法,具体实施有两种方法,一是设备驱动,二是系统调用的方法。

/dev/mem驱动的源文件在drivers/char/mem.c中。这个文件还生成了一些常用的字符设备驱动,表现为/dev/zero,/dev/null等一些特殊的字符设备驱动。cat /dev/mem时,显示的是所有物理内存的地址以及内容信息,通常情况下,只有root用户对其有读写权限。

1. 像使用普通字符设备驱动一样使用/dev/mem.

2. 通过hexedit工具来直接查看/dev/mem,结果如下图:

最左边显示的是物理地址,右边的以4个字节为一组,一行4组,共16个字节。最右边显示的是各内存字节单元内容的ASCII码对于的字符信息。这个文件可以直接修改,按下tab键进入修改模式,按下F2键保存修改内容,修改实时生效。

3. 既然/dev/mem内是全部的内存信息,通过mmap系统调用,将物理内存地址映射到进程的地址空间,从而实现对内存物理地址的读写。

介绍一下,mmap系统调用。

addr:欲映射到地址空间的起始地址,通常设置为NULL,表示让系统自动选定。

length:想要映射的文件大小,以字节为单位。

prot:映射区域的保护方式,有以下几种。

PROT_EXEC:映射区域可执行。

PROT_READ: 映射区域可读。

PROT_WRITE:映射区域科学

PROT_NONE :映射区域不能被访问

flags:映射区域的一些特性,有以下几种。

MAP_FIXED 如果映射不成功则出错返回,
           MAP_SHARED 对映射区域的写入数据会写回到原来的文件
           MAP_PRIVATE 对映射区域的写入数据不会写回原来的文件
            MAP_ANONYMOUS
            MAP_DENYWRITE 只允许对映射区域的写入操作,其他对文件直接写入的操作将被拒绝
            MAP_LOCKED 锁定映射区域

fd: open返回的文件描述符

offset:被映射文件的偏移量,表示从文件的哪个地方开始映射,一般设置为0.offset必须为4K的整数倍。

例子:要读取物理地址为0x35004000为基地址的,偏移为0x20的内容。fd为打开/dev/mem的文件描述符。ALLOC_SIZE为 1024.

map_base = mmap(0, ALLOC_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x35004000); 

type = READ_REG32(map_base + 0x20); 

  1. ///….TO do what you want.
  2. close(fd);  
  3. munmap(map_base, ALLOC_SIZE);

采用这种方法,可以实现用户空间的驱动。

Linux 下面对物理地址的访问的更多相关文章

  1. linux使用i/o内存访问外设

    一.linux中访问外设的方法. 1.IO端口(IO port) linux系统给外设分配不同的端口号,linux利用端口号来访问设备(驱动) (cpu x86) cpu访问外设通过端号,访问通过地址 ...

  2. Linux虚拟地址和物理地址的映射

    ➤背景 一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G.用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核 ...

  3. linux测试noatime对文件访问时间的影响

    linux测试noatime对文件访问时间的影响 文件(如abc)有3个时间: # stat abc Access: 2015-04-16 19:30:13.665970572 +0800 Modif ...

  4. Windows 与 Linux下关于端口不能访问的问题

    自己写的一个HTTP文件服务器,在端口 50000上监听HTTP连接请求,在Eclipse里面将程序正常地启动之后,能够在自己的机器上(Eclipse启动该程序的机器上)访问 50000端口,即Fil ...

  5. Linux中用HttpWebRequest或WebClient访问远程https路径

    要想在Linux中用HttpWebRequest或WebClient访问远程https路径,需要作如下处理: 1,更新linux根证书(只需一次,在安装mono或安装jexus独立版后执行) sudo ...

  6. Linux通过端口转发来访问内网服务(端口转发访问阿里云Redis数据库等服务)

    # 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz& ...

  7. LINUX安装好后无法访问网络

    LINUX安装好后无法访问网络 在虚拟机安装好新的LINUX系统后,ping www.baidu.com ,发现无法ping通. 键入ifconfig查询配置: eno16777728: flags= ...

  8. Linux Centos 通过虚拟用户访问FTP的配置

    Linux Centos 通过虚拟用户访问FTP的配置 实验需求: 让下面4个虚拟用户使用系统用户ftpvu的权限来连接到Linux FTP服务器,并确保都锁定在 自己的虚拟用户目录,不能切换到其他目 ...

  9. Linux上通过MySQL命令访问MySQL数据库时常见问题汇总

    Linux上通过mysql命令访问MySQL数据库时常见问题汇总 1)创建登录账号 #创建用户并授权 #允许本地访问 create user 'test'@'localhost' identified ...

随机推荐

  1. TC SRM 665 DIV2 B LuckyCycle 暴力

    LuckyCycleTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...

  2. Pimp_my_Z1

    https://github.com/Androguide/Pimp_my_Z1 Pimp_my_Z1-master.zip

  3. [Jest] Track project code coverage with Jest

    Jest comes pre-packaged with the ability to track code coverage for the modules you're testing, but ...

  4. Android 滑动效果高级篇(七)—— 华丽翻页效果

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前看到像ipad上的ibook的模拟书籍翻页的特效感觉很炫,在android上也有像laputa和ireader ...

  5. asp.net获取客户端IP,Mac

    public class GetClientInfo { [DllImport("Iphlpapi.dll")] private static extern int SendARP ...

  6. hdu 3849 (双联通求桥)

    一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...

  7. python中文处理之encode/decode函数

    python中文处理相信迷惑过不少同学.下面说说python2/3的encode和decode函数. python2中,使用decode()和encode()来进行解码和编码,以unicode类型作为 ...

  8. 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现--转

    TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常 ...

  9. A Brief Introduction to the Design of UBIFS

    http://pan.baidu.com/s/1dDy0jip 译文:http://blog.csdn.net/kickxxx/article/details/6573396 项目闲暇,想了解下UBI ...

  10. Maven学习小结(六 setting.xml详解[转])

    当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置.这包含了本地仓库位置 ...