免费注册 查看新帖 |

Chinaunix

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

[内存管理] 关于虚拟地址转化物理地址的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-02 12:18 |只看该作者 |倒序浏览
对于内核的空间分布,有三个区域,DMA,NORMAL,HIGHMEM。
在NORMAL区域,虚拟地址转物理使用了偏移量的操作可以直接获取。
那么对于DMA区域,这部分的虚拟地址如何通过程序转成物理地址?
另外,对于给定的物理地址,如何通过程序获取到内存上的值?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-06-03 08:50 |只看该作者
这里说的Zone是物理内存的概念,跟虚拟地址空间的关系取决于相关内存是“谁”使用的,如果是“内核”使用(vmalloc除外),那么其虚拟地址和物理地址直接的转换就是一个偏移;如果是“用户态”使用,那么就需要通过页表转换。对于这三个Zone,用户态和内核都是可以使用的,所有不能说Normal区的转换就是一个偏移。

论坛徽章:
0
3 [报告]
发表于 2014-06-03 09:53 |只看该作者
哦,
1.是不是用户空间优先分配ZONE_HIGHMEM,只有ZONE_HIGHMEM 分配完了,才从ZONE_NORMAL 分配?
2.如果用户空间分配了ZONE_NORMAL 的内存,那么内核也是可以访问到这块内存的,这样是不是可以形成一种内核和用户态的数据交互方式?
3.假如是在内核空间,ZONE_DMA 和ZONE_NORMAL 一样,也是直接映射的吗?

回复 2# humjb_1983


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-06-03 09:58 |只看该作者
1、默认情况下,用户态是先使用HIGEMEM的
2、是的,只需要将相应的物理内存映射到各自的虚拟地址空间中,就可以交互了,相当于共享内存。
3、是的,都是内核态使用的话,那么转换就是一个偏移了。

论坛徽章:
0
5 [报告]
发表于 2014-06-03 10:28 |只看该作者
请问那怎样设置可以优先分配ZONE_HIGHMEM 的内存?
humjb_1983 发表于 2014-06-03 09:58
1、默认情况下,用户态是先使用HIGEMEM的...

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-06-03 12:29 |只看该作者
默认用户态不就是先分配ZONE_HIGHMEM 么?呵呵
顺序取决于内存分配内存使用的flag,如GFP_KERNEL,GFP_ATOMIC之类的,可以在代码中搜一下。

论坛徽章:
0
7 [报告]
发表于 2014-06-03 13:16 |只看该作者
啊,打错了,是ZONE_NORMAL
谢谢回复啊,收获颇多啊
回复 6# humjb_1983


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
8 [报告]
发表于 2014-06-03 16:05 |只看该作者
cu_philfrank 发表于 2014-06-03 13:16
啊,打错了,是ZONE_NORMAL
谢谢回复啊,收获颇多啊
回复 6# humjb_1983

呵呵,当高端内存没有了,那就只能从低端分配了~

论坛徽章:
0
9 [报告]
发表于 2014-06-04 15:05 |只看该作者
回复 8# humjb_1983
我做了一个实验:
1.打印 init_mm->pgd ,显示出来的是页目录,取第772项(768项开始表示内核区域了),值为0x00F1F067,这个地址在物理内存的DMA区域,如果DMA也是直接映射的话,那么地址 0xC0F1F067 (0x00F1F067 + 0xC0000000)就应该是一个页表的首地址了。
2.接下来打印 0xC0F1F067 的内容,理论上应该是 0x01000000什么这种类似的(应为页目录中的772项对应的虚拟起始地址为0x01000000),但是打印出来的内容并不是页表项的内容。

所以ZONE_DMA并不是直接映射的吧。


   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2014-06-04 18:35 |只看该作者
“0xC0F1F067 的内容,理论上应该是 0x01000000什么这种类似的(应为页目录中的772项对应的虚拟起始地址为0x01000000)”--这是为什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP