所以,其实你指的3G+896M是指的虚拟空间,而当你的内存只有512M时,照样是可以映射到VMALLOC_START~VMALLOC_END之间。
二,ULK(understanding the linux kernel)书中说:
.从0到3G的线性地址空间,无论用户态还是内核态都可以访问寻址.
.从3G到4G的线性地址空间,只有内核态可以访问寻址.
问题:既然内核态可以访问0到4G的所有线性地址,那么所谓的大于896M的高端物理内存,内核不就可以通过0到3G的线性地址来映射访问吗?
同样的道理,内核分配内存的虚拟空间是3G~4G(可配置),也就是说分配内存时,只有这么大的虚拟空间(0~3G给用户,当然内核可以访问用户态的内存,这里说的是分配内存)。用一个high_memory(896M)就是为了防止以下几点:
1,像上面所说的,实际内存还很多时,而连续内存很少,这样我们可以定义一个vmalloc区解决这个问题。
2,如果实际内存大于1G,那么我们需要kernel也能分配大于1G的物理地址到内核空间(3G~4G)。fix_map区可以解决这个问题
当然还有些,我也有点淡忘了。