参考链接: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. pjsip视频通信开发(上层应用)之拨号键盘下部份拨号和删除功能

    我们开发的是视频电话,所以既可以视频通话,可以只有音频的通话,所以底部含有两个按钮,最后一个就是删除功能,如果输入错误,我们可以删除输入的内容. 这里我们要通过重写LinearLayout来实现这部份 ...

  2. 401 Palindromes(回文词)

      Palindromes  A regular palindrome is a string of numbers or letters that is the same forward as ba ...

  3. 使用maven命令建立java项目

    在terminal中输入: mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -Darc ...

  4. 互联网常见Open API文档资源

    原文地址:http://blog.sina.com.cn/s/blog_4d8713560100y272.html 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网 ...

  5. cc代码学习笔记1

    #define #define INT32 int #define INT8 char #define CHAR char #define SSHORT signed short #define IN ...

  6. sql 事务处理

    事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会 提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有 数据更改均被清除. 事务三种运行模式 ...

  7. [置顶] mybatis的批量新增

    开发项目中,总是与数据打交道,有的时候将数据放入到一个集合中,然后在遍历集合一条一条的插入,感觉效率超不好,最近又碰到这个问题,插入50条数据用了将近1s,完全满足不了系统的需求.效率必须加快,然后网 ...

  8. Helpers\Sessions

    Helpers\Sessions The session is a static class, this means it can be used in any controller without ...

  9. 本地计算机上的XXX服务启动后停止。某些服务在未由其它服务或程序使用时将自动停止。咋整?

    用C#写个windows服务,安装部署后去启动时,提示说“本地计算机上的XXX服务启动后停止.某些服务在未由其它服务或程序使用时将自动停止”.咋整?就像下面酱紫: 度娘说不知道咋整,我想把程序附加到w ...

  10. js里一些经典的算法

    //1.找出某个数字在一组数组内的存不存在 如果存在 找出他所在的索引. function indexOf(arr,item){ var i; if(Array.prototype.indexOf){ ...