关于存储管理的疑问
虚拟空间3-4G用做内核空间,其中一部分用来映射实际的内存(简化点说,如果是小内存,前面对应内存,后面用做vm_area分配的地址空间;如果是大内存,4G最后还包括高端映射等)
我的问题是
1:映射内存的含义是不是说,当前内存中的数据是什么,虚拟空间高1G对应着内存的那部分内容就是什么,两者实时更新,一直相等?
2:alloc_pages(分配策略,每次分配的页数量) 返回的是mem_map[]数组里的一个page值,并由这个值找到对应着的4K空间?alloc_pages()既可以分配系统空间,也可以分配用户空间,在调用alloc_page()函数时,仅仅是找到一个可用的4k空间,而对返回的页面做何用途并不关心。具体它做何用途,对应什么虚拟地址,由set_pgd,set_pmd,set_pte三函数建立的映射关系来决定。也就是说,在任意时刻,内存中,除了最前端的硬件和内核保留的地址空间,其余部分都是动态调整的。这部分动态调整的物理空间,可以包括所有的虚拟地址空间。可能相临的两个PAGE,一个用于对应内核空间,一个对应用户空间。如果是这样的话,相同的分配条件下,为什么说内核空间资源比用户空间宝贵呢?完全可以需要一个就分配一个啊。
3:本质上,无论什么内存分配方式,都是在这个动态的内存区域内(对应全局mem_map[]数组)找到空闲的4K(如果是slab的话,大小就不定),将其与某个线性地址建立映射。也就是说,所有的分配方式,最终都可以统一到alloc_page函数的调用上来。如果做一个简化的话,内核中可以仅仅用一个alloc_page()解决所有问题。
4:通用缓冲队列,专用缓冲队列各自分配的空间是怎么安排的?各自对应什么线性地址,实时存于内存的什么位置?是有规律的连续存放还是能以4k为单位,分散存储?它们与普通的alloc_page()分配的空间是分开的还是重叠的(即是不是某个空间就是事先留出来给缓冲队列用的)?
5:内核镜像包括内核所有用到的数据结构,如vm_area_struct,vm_area等。这些数据结构本身也需要内存。比如,一个vm_area需要站用100个字节。这100字节空间的分配过程是怎样的?一些自己的想法和问题,提得有点乱,估计有很多想法是错误的。与大家讨论,请大家解惑。