如何获取物理内存地址

snowlily1981 2009-06-04 02:59:33
大家好,请教问题如下:
在linux环境下,用c开发,为某个指针malloc一段空间,此时指针指向的是虚拟地址,请问如何获取这个虚拟地址的物理地址?

ioremap函数可以把物理地址映射为虚拟地址,有无反过来映射的函数?

非常感谢您的关注
...全文
695 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
blh 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 blh 的回复:]
引用 5 楼 kakaja 的回复:
段地址 + 偏移量就是物理地址


对于X86实模式情况下,也是物理地址 = 段地址 *16 + 偏移量,呵呵
[/Quote]

不好意思,物理地址 = 段地址 *16 + 偏移量在早期的16位X86系统中,在32位X86实模式中使用物理地址 = 段地址 + 偏移量,儿在虚拟模式中段地址不再使用,段寄存器用于其他用途,对于非X86系统,如一些其如是CPU,不使用虚拟内存,代码中的地址直接回映射到真正的物理地址,更详细内容可以找一本相关CPU的手册看看
amossavez 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 blh 的回复:]
引用 5 楼 kakaja 的回复:
段地址 + 偏移量就是物理地址



对于X86实模式情况下,也是物理地址 = 段地址 *16 + 偏移量,呵呵
[/Quote]

学习了!
blh 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kakaja 的回复:]
段地址 + 偏移量就是物理地址
[/Quote]

对于X86实模式情况下,也是物理地址 = 段地址 *16 + 偏移量,呵呵
ZXW0521 2009-06-05
  • 打赏
  • 举报
回复
不知道答案,来学习
kakaja 2009-06-05
  • 打赏
  • 举报
回复
段地址 + 偏移量就是物理地址
jiyan1221 2009-06-05
  • 打赏
  • 举报
回复
啊,关注。。。
snowlily1981 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lingyin55 的回复:]
给个链接你看看有没有帮助
http://www.cn-teacher.com/fuwu/dn/bcjs/vccjc/200704/189097.html
[/Quote]

这个是NT的,有linux的吗?
snowlily1981 2009-06-05
  • 打赏
  • 举报
回复
指针返回的地址,也就是虚拟地址,是不是偏移量?或者说与偏移量有关系吗?
shiweifu 2009-06-04
  • 打赏
  • 举报
回复
学习
blh 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 snowlily1981 的帖子:]
大家好,请教问题如下:
在linux环境下,用c开发,为某个指针malloc一段空间,此时指针指向的是虚拟地址,请问如何获取这个虚拟地址的物理地址?

ioremap函数可以把物理地址映射为虚拟地址,有无反过来映射的函数?

非常感谢您的关注
[/Quote]

对于采用分页方式和虚拟内存的操作系统,你不需要知道,也不能知道,你程序中某个指针的物理地址(这个地址会随着内存页的换入换出变换),你的程序的内存是线性地址编码,当你的代码被执行时,才被OS根据规则映射到真正的物理内存中

在linux中,你可以在用户空间访问物理地址(需要root权限),FILE * fp = fopen("/proc/dev/mem", "wb+"),对这个文件指针fp进行读写操作就是对物理内存的读写操作

如果你希望想其他指针一样修改物理地址,那么你可以用mmap调用将你希望访问的物理地址映射到你的程序的逻辑地址再进行访问
lingyin55 2009-06-04
  • 打赏
  • 举报
回复

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧