在用户空间(和内核空间)访问内存的绝对地址
问题: 开发板中配置,S3C2410+NAND FLASH+SDRAM; 解决: 想起 ioremap的功能,就从网络上查阅了些资料,很有收获。 1. 在内核空间访问 原来在linux下访问绝对地址时需要“地址映射”,就是需要把物理地址映射到虚拟地址。不过具体的原理我还不清楚,参考了一篇博文 /*好像需要下面的头文件*/ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/mm.h> #include <asm/io.h> /* for virt_to_phys */ #include <linux/slab.h> /* for kmalloc and kfree */ void* v_addr = ioremap(0,1024); 第一个参数是要访问的物理地址; 第二个参数是要访问区域的大小; 函数返回映射后区域的起始虚拟地址; 然后就可以直接对v_addr进行读写了。 注意,这里只是将物理空间映射到内核空间,在用户空间还是不能访问的。 2. 在用户空间访问(1) 使用ioremap映射到内核空间后,可以使用remap_pfn_range将内核空间映射到用户空间,应该就可以访问了,比较复杂,没有尝试…… 可以参考:? http://www.scs.ch/~frey/linux/memorymap.html? On 2.6 things got even simpler. The remap_pfn_range function sets the correct flags in the vm_area. remap_pfn_range can be called for a set of physically contiguous pages. Do map the pages you therefore have to: 3. 在用户空间访问(2) 查资料时,在评论里发现了下面的方法。 参考:? http://hi.baidu.com/zengzhaonong/blog/item/369f25295664a1fc98250a70.html? int fd; void *start; fd = open("/dev/mem",O_RDONLY); start = mmap(NULL,10,PROT_READ,MAP_PRIVATE,fd,0); 用/dev/mem和mmap,在用户空间访问寄存器用,直接指定访问的物理地址就好了。 这个方法比上面的方法节省了写驱动。 另外,关于函数mmap, mmap方法是file_operations结构的一部分,用户空间系统调用原型为: mmap (cadaar_t addr,size_t len,int prot,int flags,int fd,off_t offset) 但是文件操作声明如下: int (*mmap) (struct file *filp,struct vm_area_struct*vma) 注:vm_area_struct 是描述进程地址空间的基本管理单元。vma中就需要包含用于访问设备虚拟地址的信息,因此大量工作是在内核中完成的。 快乐在于解决一个又一个的问题~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |