我在读关于那个那块旧地的文章。该链接的摘要是创建一个4Gb的内核空间,而不是默认的1Gb。
由于许多具有dma功能的设备只能访问32位地址或4Gb,这是否意味着在该自定义内核空间(4G低内存而不是1G)中的任何空闲位置都可以使用,而无需所有高内存映射的麻烦?
额外的问题: IOMMU是否也能以更大的内核低内存来提高速度呢?
我认为它避免了跳转缓冲器、高内存映射和许多复杂的事情来实现->更好的性能。
发布于 2015-11-08 13:54:26
很久以前(80386年代),大多数计算机的内存不足16 MiB,没有内存映射的PCI设备,空间的1 GiB听起来非常大(特别是对于一个“临时内核”,它只能在GNU完成自己的内核之前使用)。将所有的物理RAM映射到内核空间听起来是个好主意,所以事情就是这样发生的。
时间过去了。大量的代码(设备驱动等)都依赖于“映射到内核空间的所有物理RAM”。
更多的时间过去了。我来了。内存大于1 GiB的计算机出现了。英特尔公司增加了PAE,这样计算机就可以拥有几乎64 GiB的内存。内核空间仍然限制在1 GiB以内。“映射到内核空间的所有物理RAM”的想法都被打破了。但是,此时许多代码依赖于“映射到内核空间的所有物理RAM”。现在解决问题的根本原因并正确地进行内存管理已经太晚了(请参阅最后的注释)。
这导致了丑陋的黑客/工作环境;从"2 GiB/2 GiB拆分“开始,这对于拥有大约1 GiB内存的系统来说是一个不错的妥协(当内存有2 GiB或更多时也没有帮助)。
"4 GiB/4 GiB“是下一个愚蠢的攻击。这里的问题是,从一个虚拟地址空间切换到另一个虚拟地址空间是非常昂贵的(由于TLB刷新和TLB丢失);为了实现"4 GiB/4 GiB“,每次CPU从”用户空间“切换到”内核空间“(每个内核API调用、每个IRQ等)和每次CPU切换回(从”内核空间“返回”用户空间“)时,都必须发生这种情况。
“高内存映射”是第三次尝试不解决问题的实际原因。
更多的时间过去了。最终,AMD推出了长模式,内核可以有多达128 TiB的空间。Linux开发者欢欣鼓舞-- 128 TiB的空间听起来非常巨大(当计算机的内存通常不足128 GiB ),就像30年前空间的1 GiB听起来那么大。这解决了“永远”的问题,对吗?!
对于只能在物理地址空间的前4 GiB中使用RAM的DMA设备;对于"4 GiB/4 GiB“方案,它们可以很容易地将数据从内核空间传输到内核空间。然而,几乎所有这些数据都必须传输到/从用户空间中传输;这意味着您仍然需要反弹缓冲区,而"4 GiB/4 GiB“方案根本帮不上什么忙。
IOMMU可以帮助避免弹跳缓冲区,但在很久以前,大多数计算机都没有IOMMU。即使是现在,英特尔也没有在他们所有的CPU上提供它(这是为了让人们为没有禁用功能的CPU支付额外费用)。这意味着内核要在所有计算机上正确工作,它只能正确地工作在没有IOMMU的计算机上。
注意:“映射到内核空间的所有物理RAM”方法实际上没有什么好处,因为内核根本不需要访问绝大部分RAM。但是,对于不完全理解分页的初学者来说,这种方法似乎很容易(并且不知道如何使用分页功能强大的技巧来使内核受益,就像它们用于造福进程一样)。正因为如此,“映射到内核空间的所有物理RAM”是狂热的内核/OS开发人员反复犯的设计错误。请理解,当这个错误发生时,Linus是一个狂热的内核开发人员(当您现在看到现代Linux时,很容易忽略这一点)。
https://softwareengineering.stackexchange.com/questions/302063
复制相似问题