Chinaunix

标题: 高端内存存在的意义 [打印本页]

作者: icanth    时间: 2012-05-11 16:13
标题: 高端内存存在的意义
问两个很二的问题,1)Linux为什么要划分出3G/1G的空间?2)高端内存存在的意义是什么?

高端内存主要是解决1G的虚拟空间下大于1G物理空间的问题,可以这么理解么?
作者: muzi19861113    时间: 2012-05-11 16:49
1. 1G/3G是为了将4G的线性地址划分为内核空间/用户空间。
    当用户空间的进程要访问内核空间的地址的时候,就会报错。
    是一种保护机制。
2. 在32为的系统中,高端内存是指大于896MB的物理地址空间。
    以内核的角度来看,高端内存时不能直接映射到自己的线性地址当中的。
    而只能通过其他方式暂时的进行映射。

以上是本人愚见,不知道能不能帮你解开疑惑。
作者: 灌水菜鸟    时间: 2012-05-11 16:54
楼上正解。
不过不同的架构上分界线不尽相同,内核用户也可以是4G空间对半劈开。高端内存的物理分界也不是固定的896MB。
作者: 瀚海书香    时间: 2012-05-11 17:17
回复 1# icanth
1)Linux为什么要划分出3G/1G的空间?2)高端内存存在的意义是什么?

高端内存主要是解决1G的虚拟空间下大于1G物理空间的问题,可以这么理解么?


1.划分空间,是为了将内核态和用户态地址空间区分开,提高安全性。
   至于这个3:1的比例,则是一个人为设定值,可以是2:2,也可以是1:3。
2.高端内存 这里以3:1为例。内核空间只有1G,如果物理内存超过了1G,没有高端内存,就无法管理所有的物理内存了,所有需要高端内存。


   
作者: icanth    时间: 2012-05-11 20:37
回复 2# muzi19861113

清楚多了,谢谢哈,~
作者: whxlovehy    时间: 2012-05-12 11:50
回复 2# muzi19861113


    “以内核的角度来看,高端内存时不能直接映射到自己的线性地址当中的。
    而只能通过其他方式暂时的进行映射。”

    弱弱的问一句,为什么不能直接映射?
作者: aweii    时间: 2012-05-12 11:56
内核线性空间有限,即内核页表项有限,所以896M以上的无法像0~896MB那样支持一一映射,只能临时映射了
作者: hk1980    时间: 2012-05-13 09:21
32 bit system can only addr 2^32 bit mem addr. which is why we have 4G mem space. 1~3 G space is used by usermode context, and 4th G is used for kernel context. Of course physical mem can be more than 4G, and so we need a way to addr. mem above 4G, kernel use mem page frame to addr. those, not the linear addr.. 896M is not exactly 1G, is because, some space are reserved for low on mem cases, so kernel resere some from the 1G leaner addr. for those, say DMA, atomic mem alloc requests, so it decide to use 896M as max. Above that, it needs to dynamic alloc pages to addr. mem indirectly. Buddy system is used to managed those requests for allocating pages.

in 64 bit machine, there is no high mem area, or empty one. Because kernel can addr. the memory 2^64 bytes, so a linear addring is always possible.
作者: kudakitsune    时间: 2012-05-13 15:40
回复 1# icanth
about first one,

安全方面的考虑并不是这个问题的答案。

其实也完全可以用4G/4G split。甚至有人尝试去实现它
4G/4G split on x86, 64 GB RAM (and more) support

问题是,导致频繁的TLB-flush。
同时,由于硬件的限制,也无法把user space和kernel完全割裂开,4G for user space中必须有一部分属于kernel的页。

由于实现上,用户空间和核心空间必然要共享4G地址空间,同时由于性能方面的不利影响,虽然4G/4G split在内存使用方面有一定的优势,
community更倾向于3G/1G split。
作者: tempname2    时间: 2012-05-13 17:02
回复 9# kudakitsune

x86切换ring级别的时候不能自动切换页表,这就是在缺乏硬件支持下让内核拥有独立的地址空间。x86下,tlb的问题可以设置内核页表的global标志,这样大部分时候切换页表时tlb还能hold住,能减少一些损失,但到什么程序就不好说了。

这样做大的问题应该是内核态往用户态传数据更麻烦了,要跨地址空间。我印象中,内核态与用户态共享地址空间已经是演化后的结果了。以前有CPU在硬件上就支持内核态与用户态地址空间分离的。
作者: kudakitsune    时间: 2012-05-13 19:23
本帖最后由 kudakitsune 于 2012-05-13 19:24 编辑

回复 10# tempname2

thanks for your comment.

86切换ring级别的时候不能自动切换页表,这就是在缺乏硬件支持下让内核拥有独立的地址空间。x86下,tlb的问题可以设置内核页表的global标志,这样大部分时候切换页表时tlb还能hold住,能减少一些损失,但到什么程序就不好说了。

这个是没有页表自动切换的时候,要面临的问题

这样做大的问题应该是内核态往用户态传数据更麻烦了,要跨地址空间。

这个是无论是否有页表自动切换,都要面临的问题


我印象中,内核态与用户态共享地址空间已经是演化后的结果了。以前有CPU在硬件上就支持内核态与用户态地址空间分离的。

我对这个部分比较感兴趣能不能具体一点解释一下。

作者: tempname2    时间: 2012-05-13 19:48
回复 11# kudakitsune

就是支持硬件切换页表。pdp-11的页表放在一系列寄存器里,内核态一组,用户态一组,根据运行级别来决定使用哪组寄存器作为页表。

七十年代初期的pdp应该是小型机之王了,现在好像没有哪种CPU还有这样的设计。我猜想独立内核地址空间是不是当时操作系统理论里的主流观点,后来才慢慢演化成现在这样。
作者: tempname2    时间: 2012-05-13 19:56
There is no reason for any individual to have a computer in his home,真是悲剧。
作者: midunren    时间: 2012-05-14 12:24
高端内存是一个发展趋势 存在即合理
作者: 灌水菜鸟    时间: 2012-05-14 13:22
midunren 发表于 2012-05-14 12:24
高端内存是一个发展趋势 存在即合理


发展趋势是64位,高端内存不过是软件跑赢硬件的一个小小的浪花而已,拍到沙滩上很快就会消失的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2