免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2573 | 回复: 2
打印 上一主题 下一主题

将用户虚拟地址转换为物理地址(linux i586 32位地址机器) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-13 11:18 |只看该作者 |倒序浏览
在linux i586上. 要在KERNEL中调用, 同时要保证被转的地址有读权限
和正在内存.  因为仅仅为了演示, 权限检查不够.

paddr是一个kernel中的地址,可以用它来检查物理地址来验证转换正确. 因为物理地址无法在正常时候使用.

这不是通用的完善的程序,仅仅是为了玩而已.

[quote]原帖由 "flw"]下次贴代码请正确使用 code 标签,这次先帮你改过。[/quote 发表:
  1. #include <linux/module.h>;
  2. #include <linux/types.h>;
  3. #include <linux/errno.h>;
  4. #include <linux/slab.h>;
  5. #include <linux/romfs_fs.h>;
  6. #include <linux/fs.h>;
  7. #include <linux/init.h>;
  8. #include <linux/pagemap.h>;
  9. #include <linux/smp_lock.h>;
  10. #include <linux/buffer_head.h>;
  11. #include <linux/vfs.h>;
  12. #include <asm/uaccess.h>;



  13. //convert a virtual address to physical address, and returns a v-addr pointer used to access the memory

  14. long             //physical memory address returned
  15. va2pa(
  16. struct mm_struct *mm,      //user task mm
  17. unsigned long uaddr,    //the user virtual address to convert
  18. char **kaddr)        //the kernel virtual address
  19. {
  20. struct page *page;
  21. pgd_t *pgd;
  22. pte_t *pte;
  23. long pageno;
  24. unsigned long pg, paddr;
  25. char *cp;

  26.             
  27.     pgd = pgd_offset(mm, uaddr);            
  28.     pageno = ( (*(unsigned long*)&pgd[0]) / PAGE_SIZE );
  29.             
  30.     page = pfn_to_page(pageno); //get page from physical page frame no
  31.     pte = lowmem_page_address(page); //pte_table
  32.     pte = pte + pte_index(uaddr); //pte entry
  33.     pg = ( *(unsigned long*)&pte[0] >;>; 12 ); //physical page no
  34.     paddr = (pg << 12) + (uaddr & 0x00000fff);
  35.    
  36.     page = pfn_to_page(pg);
  37.     cp = lowmem_page_address(page); //cp point to the vaddr page
  38.     cp += (uaddr & 0x00000fff);  //cp point to vaddr
  39.     *kaddr = cp;
  40.     return paddr;
  41. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2004-10-13 12:16 |只看该作者

将用户虚拟地址转换为物理地址(linux i586 32位地址机器)

谢谢斑竹flw !
我用了[code] ........[code/], 可能是用错了。SORRY

论坛徽章:
0
3 [报告]
发表于 2004-10-13 12:36 |只看该作者

将用户虚拟地址转换为物理地址(linux i586 32位地址机器)

对不起----
“paddr是一个kernel中的地址,可以用它来检查物理地址来验证转换正确. 因为物理地址无法在正常时候使用.”中的paddr应该是kaddr. 我写错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP