linux 访问绝对地址,linux在用户空间(和内核空间)访问内存的绝对地址.doc

本文介绍了在Linux环境下,如何使用ioremap和remap_pfn_range函数来访问物理内存。在内核空间,通过ioremap将物理地址映射为虚拟地址进行访问。而在用户空间,可以通过remap_pfn_range将内核空间的映射区域映射到用户空间,实现用户空间对物理内存的访问。这一过程对于嵌入式系统的内存管理尤其关键。
摘要由CSDN通过智能技术生成

PAGE / NUMPAGES

在用户空间(和内核空间)访问内存的绝对地址

问题:

开发板中配置,S3C2410+NAND FLASH+SDRAM;其中,SDRAM的地址为0x3000 0000;另外,由于需要从NAND FLASH启动,在地址0x0000 0000处有一块SRAM作为辅助(stepping stone),大小是4K。启动原理是,系统上电后,硬件会自动将NAND FLASH的前4k代码拷贝到SRAM中,从SRAM中启动系统,系统启动后SRAM就不再用了。现在的问题是,打算系统启动后,利用一下SRAM,但是不知道在linux下如何去访问SRAM。资料个人收集整理,勿做商业用途

解决:

想起 ioremap的功能,就从网络上查阅了些资料,很有收获。

1. 在内核空间访问

原来在linux下访问绝对地址时需要“地址映射”,就是需要把物理地址映射到虚拟地址。不过具体的原理我还不清楚,参考了一篇博文/do2jiang/article/details/5450839主要是用ioremap函数。资料个人收集整理,勿做商业用途

/*好像需要下面的头文件*/??

#include? ??

#include? ??

#include? ??

#include??/*?for?virt_to_phys?*/ ??

#include??/*?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:??? * Implement a mmap method for your driver??? * Set the reserved bit on the pages you are mapping into user space??? * Call remap_pfn_range to map your buffer into user space Example:?? ?if (remap_pfn_range(vma,?? ??? ??? ???? vma->vm_start,?? ??? ??? ???? virt_to_phys((void *)kmalloc_area) >> PAGE_SHIFT,?? ??? ??? ???? size,?? ??? ??? ???? vma->vm_page_prot)) < 0) {?? ??? ?printk("remap_pfn_range failed\n");?? ??? ?return -EIO;?? ?}The arguments of the remap_pfn_range function are:??? * vma: vm_area_struct has passed to the mmap method??? * vma->vm_start: start of mapping user address space??? * virt_to_phys((void *)kmalloc_area) >> PAGE_SHIFT: page frame number of first page??? * size: length of mapping in bytes??? * vma->>vm_page_prot: protectio

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值