Linux 下面对物理地址的访问

参考链接: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 下面对物理地址的访问

时间: 2024-07-29 19:56:34

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

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

?背景 一般情况下,Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G.用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间.每个进程的用户空间都是完全独立.互不相干的,用户进程各自有不同的页表.而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的.内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序.3~4G之间的内核空间中,从低地址到高地址依次为:系统物理内存映射区-隔离带-vmalloc虚拟内存分配

Linux 下IO端口编程访问

以前写的一篇笔记,偶尔翻出来了,放在这里做个纪念 Linux 下IO端口编程访问 这里记录的方法是在用户态访问IO端口,不涉及驱动程序的编写. 首先要包含头文件 /usr/include/asm/io.h ioperm() 在 unistd.h 中声明.用来打开对IO端口的访问权限,要求程序执行时必须有root 权限.只可以打开0x00到0x3ff 这一地址段的IO端口. ioperm( from, num, turn_on) 比如: #include<asm/io.h> #include&l

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

要想在Linux中用HttpWebRequest或WebClient访问远程https路径,需要作如下处理: 1,更新linux根证书(只需一次,在安装mono或安装jexus独立版后执行) sudo mozroots --import --ask-remove (独立版是:sudo /usr/jexus/mozroots --import --ask-remove) 2,在web程序中,在运行https请求之前的某个地方,比如Global.asax的Application_Start方法中添加

Linux安装Tomcat外部不能访问

Linux安装Tomcat后本地可以正常访问,可是这时Tomcat还不能被外界访问需要在Linux默认防护墙上打开8080端口 打开 /etc/sysconfig/iptables [[email protected] ~]# vi /etc/sysconfig/iptables 在-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited这句上面添加 -A RH-Firewall-1-INPUT -p tcp -m s

Linux逻辑地址与物理地址的key point

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/32697735 以下的一段代码: #include <stdio.h> greeting() { printf("Hello, world!\n"); } main() { greeting(); } 经过gcc.ld(链接.编译)之后,生成一个elf可执行文件,再使用objdump处理,生成的反汇编代码如下: 08048368

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

# 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz&&cd rinetd sed -i 's/65536/65535/g' rinetd.c (修改端口范围) mkdir /usr/man&&make&&make install 说明:IP的端口是双字节,也就是256*256-1, 256*256对计算机来说就是0,因

linux 指定从某个ip访问某个主机或网络

linux 指定从某个ip访问某个主机或网络 测试机A上有3个ip 分别为 eth0    192.168.1.34 eth0:1  192.168.1.36 eth1    192.168.1.35 首先在测试机B上开机apache access_log tail -f /etc/httpd/logs/access_log 接着在测试机A上访问B ,可以看到 192.168.1.34 - - [26/Aug/2014:02:54:24 +0800] "GET / HTTP/1.1"

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

Linux Centos 通过虚拟用户访问FTP的配置 实验需求: 让下面4个虚拟用户使用系统用户ftpvu的权限来连接到Linux FTP服务器,并确保都锁定在 自己的虚拟用户目录,不能切换到其他目录. ftp1-3的带宽速率限制在500KB,davidge用户不限制带宽. 系统环境: [root@cent7-184 ~]# uname -r 3.10.0-229.el7.x86_64 [root@cent7-184 ~]# cat /etc/redhat-release CentOS Lin

Linux内核内存管理-内存访问与缺页中断【转】

转自:https://yq.aliyun.com/articles/5865 摘要: 简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存的引入与缺页中断的具体处理流程.先介绍了用户态进程的执行流程,然后对比了内核线程,引入高端内存的概念,最后分析了缺页中断的流程. 用户进程 fork之后的用户态进... 简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存的引入与缺页中断