当前位置: 技术问答>linux和unix
关于mmap系统调用来访问寄存器的问题
来源: 互联网 发布时间:2016-11-13
本文导语: 本帖最后由 isolated_bb 于 2011-03-06 21:18:13 编辑 本人想用mmap系统调用来访问硬件的寄存器 用户空间:unsigned char *mmap_addr; fd = open("/dev/zx_led",O_RDWR); mmap_addr = (unsigned char*)mmap(NULL,12,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); 将文件...
用户空间:unsigned char *mmap_addr;
fd = open("/dev/zx_led",O_RDWR);
mmap_addr = (unsigned char*)mmap(NULL,12,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
将文件与虚拟内存空间进行一次映射,返回被映射的虚拟空间的地址?? 我这里暂时称它为 虚拟空间地址1
内核空间(驱动):
#define LED_CONTROLLER_BASE 0x56000050
#define LED_MEM_LEN 0x0c
#define LED_CON (*(volatile u32*)(LED_CONTROLLER_BASE))
#define LED_DAT (*(volatile u32*)(LED_CONTROLLER_BASE + 4))
#define LED_UP (*(volatile u32*)(LED_CONTROLLER_BASE + 8))
static int led_mmap(struct file *file,struct vm_area_struct *vma)
{
remap_pfn_range(vma,NULL,LED_CONTROLLER_BASE,LED_MEM_LEN,VM_IO);
return 0;
}
驱动讲物理地址与虚拟地址想关联(或者说讲物理地址映射到虚拟地址空间)??我这里称它为 虚拟空间地址2
我的目的是通过对设备文件的读写来设置硬件的各种寄存器的值,那么我这样能否保证 虚拟地址空间1==虚拟地址空间2???
或者说我如何才能通过设备文件来准确的访问寄存器??
最后 我可不可以认为mmap实现了 应用层与内核层的内存的共享
|
X86体系结构不能直接将I/O空间映射到虚拟地址,
只有统一编址的处理器体系结构才支持。
只有MEM空间才能映射到虚地址。
应用程序访问I/O空间可以通过直接I/O方式,很多驱动书都有介绍,或者编写ioctl方式自己实现。
只有统一编址的处理器体系结构才支持。
只有MEM空间才能映射到虚地址。
应用程序访问I/O空间可以通过直接I/O方式,很多驱动书都有介绍,或者编写ioctl方式自己实现。
|
mmap是把打开的文件或者对象映射到内存,是经过页式管理的,内核空间的虚拟地址很多都跟用户空间的虚拟地址不一样,所以有时候拷贝时都要用copy_to_usr 或者copy_from_usr
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。