Linux在用户空间(及内核空间)访问内存的绝对地址.docVIP

Linux在用户空间(及内核空间)访问内存的绝对地址.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux在用户空间(及内核空间)访问内存的绝对地址

在用户空间(和内核空间)访问内存的绝对地址 问题: 开发板中配置,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?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: ??? * 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: protection bits, here passed along received from application 3. 在用户空间访问(2) 查资料时,在评论里发现了下面的方法。 参考:? /zengzhaonong/blog/item/

文档评论(0)

shaoye348 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档