免费注册 查看新帖 |

Chinaunix

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

[内存管理] 物理内存为什么在使用时要映射到内核空间? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-10 13:46 |只看该作者 |倒序浏览
请教一上问题:linux中有mem_map数组管理物理页面,内核为什么还要将每个物理页面映射到内核线性空间?如果用户程序发生了缺页中断,只要查找mem_map中有没有空闲页面,比如:有就映射到用户空间,为什么还要通过高端内存的复杂映射方法,将一个页面映射到内核空间,进行分配后再用呢?我不明白用户空间用的每个物理页面要先映射到内核空间,再映射到用户空间?

论坛徽章:
0
2 [报告]
发表于 2014-02-10 13:52 |只看该作者
但为什么要将访问高端内存(如物理内存的1G-4G部分)也搞的那么复杂,直接用mem_map数组中管理不就行了吗?有必要先映射到内核空间再映射到用空间吗?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2014-02-10 15:33 |只看该作者
不映射是没法访问的,这个你得去看懂CPU MMU的原理才能理解


分配给app的内存是优先从高端内存中拿,如果是高端内存中拿到的,直接就映射给用户空间了,并没有映射到内核空间;
如果分配给app的内存是低端内存中取得的,这个页早在内核启动的时候就已经先映射到低端内存了,并不是你分配的时候才去映射的


论坛徽章:
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-02-10 16:34 |只看该作者
mushroom2008 发表于 2014-02-10 13:46
请教一上问题:linux中有mem_map数组管理物理页面,内核为什么还要将每个物理页面映射到内核线性空间?如果 ...

在保护模式下,CPU使用的虚拟地址,也就是说必须映射后才能访问。
另外,不会将所有的物理内存都映射到内核地址空间的,这种说法肯定是有问题的。

论坛徽章:
0
5 [报告]
发表于 2014-02-11 09:43 |只看该作者
谢谢楼上二位大侠,但我发现当linux用户程序要使用内存时,他都是由内核分配的,内核无论是分配高端还是内存,都首先要将其映射到内核空间,再进行分配,我知道1G以内的内存是一一映射,但1G以上的高端内存分配为什么也要映射到内核空间,直接用mem_map数组管理不就行了吗?

论坛徽章:
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-02-11 10:18 |只看该作者
你把概念弄混了,用户态程序分配内存时(比如malloc、mmap),实际是分配的虚拟地址空间,“分配”操作的具体执行者肯定是内核,但此时并没有分配物理内存,也并不是你说的将内存映射到内核空间。
用户态真正的物理内存分配,发生在“写”相应内存时,会触发缺页异常,在缺页异常中进行物理内存的分配,并创建相应的页表,将其映射到进程的虚拟地址空间中。

论坛徽章:
0
7 [报告]
发表于 2014-02-11 12:48 |只看该作者
理解Linux的内存管理,首先理解的几个概念:用户虚拟地址空间、内核虚拟地址空间、物理内存页。
用户程序通过malloc等分配虚拟地址空间不会立即分配为物理内存页,是在访问该空间时通过缺页异常进行物理页的分配,如楼上所述。
内核程序既可以分配(通过kmalloc或vmalloc)内核虚拟地址空间,也可以直接分配物理页

论坛徽章:
0
8 [报告]
发表于 2014-02-12 14:32 |只看该作者
谢谢二位,我理解用户程序在使用内存时是通过在发生”缺页中断“时才内核闭为其分配物理内存,但我不理解的是,内核为什么分配(物理地址1G以上的)物理内存时要将一物理页面映射到内核空间才能分配,内核可不可以通过mem_map数组查找1G以上的空闲物理页面直接分配呢?

论坛徽章:
0
9 [报告]
发表于 2014-02-12 14:41 |只看该作者
问题的简化就是:无论是内核还是用户使用物理内存,是不是都要将其映射到内核线性地址空间?我看到一些书上讲的,物理内存都由内核分配,内核分配时无论是用kmalloc 还是vmalloc函数都要将此块物理内存映射到内核线性空间?谢谢

论坛徽章:
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-02-12 15:02 |只看该作者
本帖最后由 humjb_1983 于 2014-02-12 15:04 编辑
mushroom2008 发表于 2014-02-12 14:41
问题的简化就是:无论是内核还是用户使用物理内存,是不是都要将其映射到内核线性地址空间?我看到一些书上 ...

这个理解肯定是不对的,不是要“映射到内核线性地址空间”,分配物理内存由伙伴系统负责,会用到mem_map,但分配物理内存后,需要将其映射到“进程地址空间”中,也就是为该段内存映射虚拟地址后,进程才能使用和访问,所以这里应该是映射到“进程的线性地址空间”,不是“内核线性地址空间”。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP