[总结] Linux下/dev/mem和/dev/kmem的区别及作用

区别:
  1. /dev/mem: 物理内存的全镜像。可以用来访问物理内存。
  2. /dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。

作用:
  1. 前者用来访问物理IO设备,比如X用来访问显卡的物理内存,或嵌入式中访问GPIO。用法一般就是open,然后mmap,接着可以使用map之后的地址来访问物理内存。这其实就是实现用户空间驱动的一种方法。
  2. 后者一般可以用来查看kernel的变量,或者用作rootkit之类的。参考1和2描述了用来查看kernel变量这个问题。

参考:

  1. http://lwn.net/Articles/147902/
  2. http://lkml.org/lkml/2005/8/11/301
22.   Linux Kernel Programming  
22.1  直接访问内存[显存]地址  
22.2    
--------------------------------------------------------------------------  
23.   Linux相关问题  
23.1    
--------------------------------------------------------------------------  


22. Linux Kernel Programming  

22.1 直接访问内存[显存]地址  

Q: 现在在修改linux内核,希望能访问一段地址(其实是显存)。但发觉不能直接访问  

A: Kongming <ymwei@263.net> (Luther <Luther@pku.edu> 整理)  

通过/dev/mem设备文件和mmap系统调用,可以将线性地址描述的物理内存映射到进程  
的地址空间,然后就可以直接访问这段内存了。  

比如,标准VGA 16色模式的实模式地址是A000:0000,而线性地址则是A0000。设定显  
存大小为0x10000,则可以如下操作  

    mem_fd  = open( "/dev/mem", O_RDWR );  
    vga_mem = mmap( 0, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED,  
                    mem_fd, 0xA0000 );  
    close( mem_fd );  

然后直接对vga_mem进行访问,就可以了。当然,如果是操作VGA显卡,还要获得I/O  
端口的访问权限,以便进行直接的I/O操作,用来设置模式/调色板/选择位面等等  

在工控领域中还有一种常用的方法,用来在内核和应用程序之间高效传递数据:  

1) 假定系统有64M物理内存,则可以通过lilo通知内核只使用63M,而保留1M物理内  
   存作为数据交换使用(使用 mem=63M 标记)。  
2) 然后打开/dev/mem设备,并将63M开始的1M地址空间映射到进程的地址空间。 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值