免费注册 查看新帖 |

Chinaunix

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

[内存管理] 虚拟内存和物理内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-10 16:56 |只看该作者 |倒序浏览
大家好,最近开始了解内存管理,有个问题很是困惑:线性地址可以通过页表来找到物理地址,我不明白的是找到的这个物理地址是实际的数据存放的那个4K的首地址,还是找到的是相关的page结构体的地址,然后通过page中的某个指针指向真正存放数据的4K的地址空间,或者是那个page结构体就在那4K空间里?求大神指教....

论坛徽章:
4
丑牛
日期:2014-01-11 15:11:12亥猪
日期:2014-12-15 22:19:092015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-03-13 19:45:11
2 [报告]
发表于 2013-03-10 17:31 |只看该作者
实际的数据存放的那个4K的首地址

论坛徽章:
0
3 [报告]
发表于 2013-03-10 17:55 |只看该作者
回复 2# 魔鬼的惊叹
你的意思是page结构体中放了4K空间的首地址?哪通过页表加偏移得到的物理地址是那个?

   

论坛徽章:
0
4 [报告]
发表于 2013-03-10 17:58 |只看该作者
回复 2# 魔鬼的惊叹
你的意思应该是通过页表加偏移找到了4K空间的首地址,对吗?哪page结果体是如何跟这个4K空间建立关系的?page那个变量是指向这4K空间的?我初学,呵呵....还请指教.....


   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-03-10 20:16 |只看该作者
跟Page结构体没有任何关系!

论坛徽章:
0
6 [报告]
发表于 2013-03-10 20:56 |只看该作者
回复 5# chishanmingshen

不是说系统会对内存中的每个页都创建page结构体么,那么这个page结构体怎么和真实的那个物理内存进行关联的?
   

论坛徽章:
4
丑牛
日期:2014-01-11 15:11:12亥猪
日期:2014-12-15 22:19:092015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-03-13 19:45:11
7 [报告]
发表于 2013-03-11 07:19 |只看该作者
通过页表管理内存,每个页表中存放1024个页表项,每个页表项中保存了一个4k页面的物理基地址
我这样说我估计你还是不太明白,我建议你找本操作系统的书看吧,本科的教材就可以

论坛徽章:
0
8 [报告]
发表于 2013-03-11 09:17 |只看该作者
内核中有Page解构体数组,数组下标与内存区域是有对应的

论坛徽章:
0
9 [报告]
发表于 2013-03-11 09:45 |只看该作者
不是通过页表来管理内存吧,页表这个数据结构只是用来执行线性地址到物理的转换,线性地址其实只是几个页表索引的集合,真正的物理地址存放在页表项里面; 而page结构体才是内核用来管理内存的,每个物理页框对应一个page结构,伙伴系统就是通过page结构来管理物理内存的。
回复 7# 魔鬼的惊叹


   

论坛徽章:
0
10 [报告]
发表于 2013-03-11 11:30 |只看该作者
回复 8# pangxiezhou
正解,我看到了应该是mem_map,这个是struct page结构体数组,其中下标就是对应物理页的页框号。这个是ULK 3 p295最后一段的介绍,而且网上也有很多类似的介绍,但是我在3.5.4内核版本中试着用内核模块打印出mem_map的地址和它的值却发现如下情况:
  1. static __init watch_map (void)
  2. {
  3.         printk ("mem_map address :%p\n", &mem_map);
  4.         printk ("mem_map value%p\n", mem_map);
  5. }
复制代码
这个是内核模块代码
结果:
  1. [  674.581516] mem_map address :c3c18900
  2. [  674.581520] mem_map value  (null)
复制代码
也就是和所mem_map中的值为NULL
而且在3.5.4中mem_map的定义并不是一个结构体数组,而是struct page * ,是个指针类型。
  1. 73 struct page *mem_map;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP