免费注册 查看新帖 |

Chinaunix

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

内核的地址是简单的线性映射这句话怎么理解啊? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2005-12-06 17:50 |只看该作者
懒得看内容!你们说什么呢?
心情不好!
内存要那么大干什么?你们的内存都比我的硬盘大!

论坛徽章:
0
22 [报告]
发表于 2005-12-06 18:45 |只看该作者
原帖由 albcamus 于 2005-12-6 16:30 发表
2.而且,内核内存不分页和不换出这个也和划分zone normal,zone himem无关吧?我的意思是不需要这么划分也能实现这个。
是的。但是我觉得一个操作系统内核总得有某块是不可换出到交换分区或交换文件的,在linux下,就把这块内存命名为ZONE_NORMAL




如果zone normal的含义是不可交换内存的区域,那么,当系统物理内存小于800M怎么办?

论坛徽章:
0
23 [报告]
发表于 2005-12-06 21:12 |只看该作者
原帖由 Solaris12 于 2005-12-6 18:45 发表




如果zone normal的含义是不可交换内存的区域,那么,当系统物理内存小于800M怎么办?



ZONE_NORMAL这些词,划分的乃是线性地址空间,不是物理地址。

论坛徽章:
0
24 [报告]
发表于 2005-12-07 14:22 |只看该作者
原帖由 albcamus 于 2005-12-6 21:12 发表



ZONE_NORMAL这些词,划分的乃是线性地址空间,不是物理地址。




应该是物理地址的划分。

LKD的内存管理里写的很清楚:

ZONE_DMA 是物理内存的 <16M
ZONE_NORMAL是物理内存 16-896M
ZONE_HIGHMEM是物理内存>986M

在ULK2里描述物理内存的分页时用的是page frame,而page则专指数据,可以存放到内存和硬盘等交换设备上。

我理解ZONE的划分是基于物理内存的分页划分的,应该是page frame的划分

等下我再看看资料。

论坛徽章:
0
25 [报告]
发表于 2005-12-07 16:20 |只看该作者
原帖由 Solaris12 于 2005-12-7 14:22 发表




应该是物理地址的划分。

LKD的内存管理里写的很清楚:

ZONE_DMA 是物理内存的 <16M
ZONE_NORMAL是物理内存 16-896M
ZONE_HIGHMEM是物理内存>986M

在ULK2里描述物理内存的分页时用的是pa ...



我说错了,ZONE_XXX的确是对物理页面组成的区域的描述 。。。

至于说NORMAL被映射到3G-4G之间后就不会交换出去,这一点应该是可以肯定的。 如果物理内存不足896M,那么除了DMA区就是NORMAL区, 内核不允许NORMAL页面被换出,但是却可以通过断开页表使得该页面变为Free状态,内核态代码在获得页面之后,可以通过kfree/free_pages来释放这些页面。

--不过我原来理解错ZONE的时候感觉自己很明白,你给我一纠正,我改正了错误印象,反而糊涂了,我也找资料看看……

论坛徽章:
0
26 [报告]
发表于 2005-12-07 17:19 |只看该作者
原帖由 albcamus 于 2005-12-7 16:20 发表


至于说NORMAL被映射到3G-4G之间后就不会交换出去,这一点应该是可以肯定的。如果物理内存不足896M,那么除了DMA区就是NORMAL区,内核不允许NORMAL页面被换出,但是却可以通过断开页表使得该页面变为Free状态,内核态代码在获得页面之后,可以通过 kfree/free_pages来释放这些页面。



这点真的肯定吗,还是回到老问题,如果你的机器有512M内存,16M是DMA,剩下的都是normal,难道都不能被swap出去了吗?那就意味着整个物理内存都不能swap了。

ZONE_NORMAL和换不换出根本不是一回事。
用户进程也可以通过系统调用来让自己的页面不换出。

其实ZONE_NORMAL存在的价值就是为了那个从物理地址到线性地址就是+3G,从线性地址到物理地址就是-3G的关系。

如果我们不这么设计这种关系,那么除了16M以外的所有物理内存动态影射到1G的内核虚拟空间,就不需要分这个HIMEM了。

我感觉,HIMEM和NORMAL的区分主要是历史遗留问题,或者是LINUX内核设计者的一个选择而已。

论坛徽章:
0
27 [报告]
发表于 2005-12-07 21:10 |只看该作者
同交换不交换无关,主要是线性地址4G的限制,和内核的线性地址只有一1G有关系,在64位下没有896M的哪个概念.

论坛徽章:
0
28 [报告]
发表于 2005-12-07 21:22 |只看该作者
原帖由 menp9999 于 2005-12-7 21:10 发表
同交换不交换无关,主要是线性地址4G的限制,和内核的线性地址只有一1G有关系,在64位下没有896M的哪个概念.



这个我赞同。

我的意思是,NORMAL和HIMEM可以合并,然后统一用一种共同的方法把这个区域物理内存映射入1G的线性地址空间,这样完全是可以的。但这样LINUX必须放弃 pa宏的计算方法:

#define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)


我怀疑windows和solaris就不存在这样的划分。


linux这样的划分很可能和linux是从低端系统发展起来的有关,也许是个遗留问题?

CR3中的是物理地址的算法决定了页表项只能放在zone_NORMAL区。


schudule->context_switch->switch_mm->load_cr3(next->pgd)->write_cr3(__pa(pgdir)):


目前的这种划分,在大内存的时候,可能会对系统造成很大限制。

我在想这种方案的优劣在哪里?

说不定未来,很有可能会改掉。

当然,可能性不大,毕竟64位系统的普及会使这样的需求越来越没必要

论坛徽章:
0
29 [报告]
发表于 2005-12-08 09:30 |只看该作者
凡是映射到3G-4G之间的,不会被swap出去,我能确认这一点。
注意虽然我说不会被swap出去,但是仍然可以释放。 kmalloc深情来的内存,直到你用完了释放,否则绝不会swap到磁盘上。为什么访问用户空间需要copy_from_user这样的函数?是因为用户空间可能被swap了,需要处理缺页;访问内核空间页面就不要这么麻烦,直接访问就行了,这就是因为不会被swap出去。

P.S. 昨天回去看书了,有些搞明白了,有些越看越糊涂

论坛徽章:
0
30 [报告]
发表于 2005-12-08 09:58 |只看该作者

回复 1楼 comepu 的帖子

楼主混淆了一个基本的概念,就是内核可寻址的物理地址空间,和内核占用的地址空间

大多数情况,内核可以寻址所有的物理地址空间,kernel从BIOS里得到物理地址空间的size,之后就会为这些memory作页映射表,这个页映射表不查也罢,因为他们就是按照Virutal addr - 3G = phy addr来作映射的.这样内核通过这种计算可以得到任意Kernl Virutal Address所代表的物理地址,注意,这里是计算,不是指挥CPU用-3G的方法去找,一旦启用分页,所有地址都是线性地址,kernel也绕不开,在内核中jmp这样的指令CPU当然还是要查页表,虽然最后找到的phy地址如果CPU比较一下的化发现就是-3G而已
那kernel为什么还要设置个marco计算这个物理地址?因为Kernel需要监控物理内核的使用情况,有时还要向CR*填物理地址,这几乎也是唯一给内核直接喂物理地址的指令了。

空闲的物理地址被kernel用-3G映射了一次,同样在process的页表里可以被再次映射一次到用户的3G地址空间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP