免费注册 查看新帖 |

Chinaunix

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

[内存管理] 高端内存为什么需要永久映射的方式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-20 22:46 |只看该作者 |倒序浏览
  小弟是内核新手,最近刚开始啃内存管理部分的代码,看到ULK书上说高端内存的映射分为三种不同的机制:永久映射、临时映射、非连续内存分配,但是没有说是出于什么考虑,才设计了这三种机制。个人猜测:临时映射不会发生阻塞,所以可以在中断处理程序中使用,所以有存在的合理性;永久映射从字面上理解,似乎是用来将一些长时间存在的虚拟地址映射到物理地址,那么通过这种方式映射的内存会在某些情况下,性能比非连续内存分配好一些吗?究竟是哪些情境下会用到持久映射?性能为什么会好?(是因为持久映射的物理内存是连续的,所以cache命中率高么?)
  望各位高手指点,谢谢。

论坛徽章:
0
2 [报告]
发表于 2013-02-21 11:26 |只看该作者
再加一个问题~
我在读的是的2.6.24源码,参考《深入linux内核架构》,一边读一边用模块的方式打印一些内核数据的信息,实验的机器是32位的,没有开PAE。
我在我的内核模块中加入printk("%lu",swapper_pg_dir->pgd); 编译能通过,但是链接的时候却会显示swapper_pg_dir undefined,请问是为什么?是因为这个变量内核没有把他export出来,所以链接模块的时候,链接器找不到他的定义么?那我想看现在内核页目录的虚拟地址,应该怎么看?
希望各位指点,谢谢

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2013-02-21 16:30 |只看该作者
回复 2# dycforever
应该是没有导出吧。export就可以吧

   

论坛徽章:
0
4 [报告]
发表于 2013-02-22 16:25 |只看该作者
本帖最后由 dycforever 于 2013-02-22 16:26 编辑

回复 3# 瀚海书香


    谢谢,我在内核代码中加入了EXPORT_SYMBOL(swapper_pg_dir),就可以编译了,不过还有个问题:

我的代码如下:
  1. printk("swapper_pg_dir: %lu\n", swapper_pg_dir);
  2. for(i=0;i<10;++i){
  3.   printk("swapper_pg_dir[%d]: %lu \n",i, swapper_pg_dir[i].pgd);
  4. }
复制代码
结果显示,swapper_pg_dir的值是3229028352,16进制为0xC0771000,这个可以理解;
但是for循环中打印了swapper_pg_dir数组的前十个,发现它们的pgd的值都是0,这个为什么呢?swapper_pg_dir中放的不是内核页目录吗,为什么会是全0呢~~
难道系统启动完成后,最终的页目录不是由swapper_pg_dir指向的么?那应该怎样得到呢?
谢谢各位啦!

论坛徽章:
0
5 [报告]
发表于 2013-02-24 21:15 |只看该作者
今天看到,原来每个进程都有自己的页表,于是只要通过current就能获得当前进程的页目录
不过还是不知道持久映射的应用场景和好处,望各位指点哈

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
6 [报告]
发表于 2013-02-25 07:28 |只看该作者
dycforever 发表于 2013-02-24 21:15
今天看到,原来每个进程都有自己的页表,于是只要通过current就能获得当前进程的页目录
不过还是不知道 ...


关于持久映射的好处,我想应该是避免频繁修改内核页表部分吧。其他的还没有想到什么好处。

论坛徽章:
0
7 [报告]
发表于 2013-02-25 21:48 |只看该作者
主要是避免频繁修改页表,

论坛徽章:
0
8 [报告]
发表于 2013-02-27 10:12 |只看该作者
本帖最后由 kickxxx 于 2013-02-27 10:12 编辑

持久映射和临时映射都可以是物理连续的,之所以存在三种机制,是因为linux设计的缺陷或者32位的限制,比如64bit就没有高端内存这个乱七八糟的东西。
持久映射和临时映射的地址空间很小的,所以只能映射很小一部分高端内存,这两种都不是高端内存的常用使用方式
最常用的高端内存使用方式是非连续分配方式,但是可同时使用的数量仍然受vmalloc区大小的限制。

非连续内存区是使用vmalloc内核线性区,映射不连续的空间。
其实还可以把连续高端内存映射到vmalloc区,比如ioremap实现。

那么除了这几种方式,是不是高端内存就不能使用了呢?不是,高端内存虽然很难被kernel直接使用,但是仍然可以很方便的映射到应用空间,参见do_page_fault.

所以也别想的太多,什么中断可用,中断不可用的,这几个东西就是维护者一拍脑袋临时设计出来的,结果是又难用,又复杂,搞得开发者晕头转向,到64bit机这些垃圾就不会烦大家了。

比如kmap这个垃圾,谁会用它?

论坛徽章:
0
9 [报告]
发表于 2013-02-27 10:14 |只看该作者
回复 6# 瀚海书香
持久映射屁大点空间,真不知道内存维护者脑子怎么想的


   

论坛徽章:
0
10 [报告]
发表于 2013-02-27 10:17 |只看该作者
回复 5# dycforever
对我们来说,没鸟用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP