896M产生的原因有几个:
1)主要原因,x86的地址空间太小了,只有4G,kernel只分到了1G。
2)linux中,kernel的线性空间开始(3G处)对应于物理地址0
3)kernel的线性地址空间要求是identify mapping,也就是内核虚拟地址减去一个常数是物理地址
4)x86架构中,某些硬件(例如LAPIC)寄存器的物理地址位于物理地址空间中的高端(高端的意思是超出了kerenl地址空间大小)。
为了满足条件4)并预留一些可以轮换使用的线性地址,内核必须预留一部分地址空间用于映射这些硬件的寄存器,这个被预留出来的地址空间大小现在是128M,那么,kernel实际可以用的地址空间大小变成了896M。
从物理地址0开始,896M的地址空间最多能映射896M的物理内存,当平台上物理内存多于896M时,例如有1G,kernel(注意,是说 kernel)要访问这些内存怎么办?只能更新页表,使896M地址空间以下的某个地址映射到物理内存的896M以上去。由于这个缘故,产生了896M高端内存的说法。
对于用户态程序就没这个问题,因为用户程序地址空间的起始不用对应物理地址0,完全可以从896M以上的物理内存开始映射。同样,64bit平台没有这个问题,因为此时kernel的地址空间大到足以映射当前硬件技术能提供的所有内存。
所以,高端内存的说法是指内核使用896M以上物理内存的情况,和用户程序没有关系。
896MB 问题
最新推荐文章于 2021-04-30 11:32:14 发布