一, 书上说vmalloc()在3G+896M以上线性地址空间分配连续虚拟内存,3G到3G+896M线性地址被永久固定映射到了0--896M物理地址.
问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了?
二,ULK(understanding the linux kernel)书中说:
.从0到3G的线性地址空间,无论用户态还是内核态都可以访问寻址.
.从3G到4G的线性地址空间,只有内核态可以访问寻址.
问题:既然内核态可以访问0到4G的所有线性地址,那么所谓的大于896M的高端物理内存,内核不就可以通过0到3G的线性地址来映射访问吗?新年祝福网页
问题:既然内核态可以访问0到4G的所有线性地址,那么所谓的大于896M的高端物理内存,内核不就可以通过0到3G的线性地址来映射访问吗?
内核0~3G的线性地址是虚拟的地址并不在内存真正的物理内存地址。
3G到3G+896M线性地址被永久固定映射到了0--896M物理地址. 3G+896M是虚拟地址。0~896M的物理地址。如果内核开启处理器MMU的话,虚拟地址到物理地址是需要进行转化的。0~3G的虚拟地址转换时,转换为不确定的物理地址,3G+896转换为固定的地址。
>>问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了?
物理内存多大,与vmalloc()有关系吗?
vmalloc()在3G+896M~4G线性地址空间分配连续虚拟内存
3G~3G+896M线性地址被永久固定映射到了0~896M物理地址.
>>问题:既然内核态可以访问0到4G的所有线性地址,那么所谓的大于896M的高端物理内存,内核不就可以通过0到3G的线性地址来映射访问吗?
没有哪里说大于896M的高端物理内存映射到了0到3G的线性地址吧
对于用户程序来说,可见的是线性地址空间,线性地址到底映射到哪个物理内存地址,只有内核才知道
线性地址到物理内存的映射是内核和MMU单元做的事
一, 书上说vmalloc()在3G+896M以上线性地址空间分配连续虚拟内存,3G到3G+896M线性地址被永久固定映射到了0--896M物理地址.祝福网页
问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了?