免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chenzhanyiczy
打印 上一主题 下一主题

高端内存 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-03-24 14:47 |只看该作者
回复 19# re_load


我从头到尾就没说过“跟页表大小相关”吧? ……

我的意思是:切换影响效率,所以能不切换尽量不切换。
而把地址空间分成两份,一份给内核用,一份给用户用。两份地址不冲突,所以内核态和用户态切换时不需要切换页表。

论坛徽章:
0
22 [报告]
发表于 2010-03-24 14:56 |只看该作者
回复 20# kouu


   
您说的是你将来想做的,还是kernel中已经这么做的?

论坛徽章:
0
23 [报告]
发表于 2010-03-24 15:27 |只看该作者
回复 21# re_load

linux 2.2我不知道,linux 2.4已经是这样了

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
24 [报告]
发表于 2010-03-24 18:13 |只看该作者
回复 16# kouu



假设系统启动后,某个模块被动态加载,这个模块想要访问 3G~3G+1M的物理内存怎么办? (这块内存可能不是内存,而是映射在内存空间上的某个设备的资源。)


模块不是只能访问3G-4G的线性地址空间对应的0-1G的物理内存吗?因为模块处于内核态的。

怎么可以访问3G-3G+1的物理内存?

论坛徽章:
0
25 [报告]
发表于 2010-03-24 18:27 |只看该作者
回复 23# chenzhanyiczy


    从内核1G的地址空间中割出128M,不就是为了满足这个需求么……

论坛徽章:
0
26 [报告]
发表于 2010-03-24 21:06 |只看该作者
LZ找些书多瞅瞅吧,嘿嘿。。。。

论坛徽章:
0
27 [报告]
发表于 2010-03-24 22:11 |只看该作者
回复 23# chenzhanyiczy


    虚拟地址《--》物理地址。
    这里物理地址 != 物理内存的地址。物理内存的地址在PC架构上没问题,是连续的,并且,如果有1G的话,它们的物理地址在4G的物理地址空间中肯定是从0-1G的。但是,还有很多其他的物理地址在4G的物理地址空间中并不是连续、挨着物理内存的地址往高处排列的。比如显卡的板载内存(显存framebuffer)的起始地址被PCI映射到物理地址空间的0xF8000000;又或者某个设备的I/O register被PCI映射到0xCFF00000;这两个起始地址都是大于1G的,你要在内核中读写它们,怎么办?CPU是只能通过虚拟地址读写物理地址的内容的对吧,假如1G的内核虚拟地址空间全部是固定映射的话,很显然内核此时仅仅能访问到的物理地址都是属于物理内存了,根本无法访问设备的物理地址。所以,ioremap返回的地址肯定是在高端虚拟地址中的。这里的高端内存,我觉得叫高端地址更好。

论坛徽章:
0
28 [报告]
发表于 2010-03-25 00:22 |只看该作者
前面几位回答的都很好。我觉得有个地方需要再强调下:

所有的物理内存都必须直接由内核来控制。 不可能出现有部分物理内存,内核看不到而用户程序可以看到的情况。

在这个前提下,如果把内核的3G-4G虚拟地址写死映射到物理内存的0-1G,那么大于1G的物理内存就“永远”也访问不了了。不论是内核还是用户程序。那么如果机器上装了2G, 或者4G的内存,这时只能用1G, 其他的都跟没装一样。

而用了高端内存后,大于1G的物理地址也可以动态的访问了。

这个就是写死和用高端内存的根本区别。

论坛徽章:
0
29 [报告]
发表于 2010-03-25 01:30 |只看该作者
固定映射不影响用户态访问大于1g的内存吧。只是内核自己没法访问而已。你说的“不可能出现有部分物理内存,内核看不到而用户程序可以看到的情况。”这是站在设计原则的角度来说的还是什么意思?

论坛徽章:
0
30 [报告]
发表于 2010-03-25 09:11 |只看该作者
前面几位回答的都很好。我觉得有个地方需要再强调下:

所有的物理内存都必须直接由内核来控制。 不可能出现有部分物理内存,内核看不到而用户程序可以看到的情况。

在这个前提下,如果把内核的3G-4G虚拟地址写死映射到物理内存的0-1G,那么大于1G的物理内存就“永远”也访问不了了。不论是内核还是用户程序。那么如果机器上装了2G, 或者4G的内存,这时只能用1G, 其他的都跟没装一样。

而用了高端内存后,大于1G的物理地址也可以动态的访问了。

这个就是写死和用高端内存的根本区别。accessory 发表于 2010-03-25 00:22



老大,俺有不同看法。
即使内核把3-4G全部直接用OFFSET+x方式映射上了物理页,用户空间还是可以分配到高于1G的物理内存的啊。
因为高于1G的物理页可以映射到用户空间的0-3G中去的。
这个时候如果被映射了高于1G物理页的进程通过int 0x80进入内核,内核可以通过0-3G的地址访问这些物理页。
但是内核不能用3-4G的线性地址来访问高于1G的物理页啦。
总之吧,如果不保留高端内存这个128M线性地址的话,中断代码、软中断代码、内核线程等就无法访问高于1G的物理页了。
但是通过int 0x80可以执行到的代码可以通过0-3G线性地址访问。
如果保留了128M线性地址空间的话,所有代码皆大欢喜
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP