daxiguagg 发表于 2014-07-04 15:38

请教关于内核把页划分为不同的区的问题?



1:怎么ZONE_DMA,ZONE_NORMAL区的物理内存小于896MB呢,不是说内核地址空间在高3G-4G之间吗?

2:ZONE_HIGHMEM这个区的页怎么不能映射到内核地址空间呢?

3:如果在内核kmalloc申请内存,是在哪个区申请呢,如果按照书上说的,ZONE_HIGHMEM这个区不能映射到内核地址空间,那能分配的内存不是很小?小于896MB。

4:如果用户空间申请内存,又是在哪个区申请呢?

super皮波 发表于 2014-07-04 16:37

1:怎么ZONE_DMA,ZONE_NORMAL区的物理内存小于896MB呢,不是说内核地址空间在高3G-4G之间吗?
这里的896M是从物理内存上说的,3-4G指的是线性地址来说的
2:ZONE_HIGHMEM这个区的页怎么不能映射到内核地址空间呢?
linux只有1G的内核空间,如果你有大于1G的内存的时候,肯定不能都做好映射,所以内核采取的方法是,留出一部分线性空间(3G+896M - 4G,大约120M左右),用于做高端映射,这部分空间比较灵活
3:如果在内核kmalloc申请内存,是在哪个区申请呢,如果按照书上说的,ZONE_HIGHMEM这个区不能映射到内核地址空间,那能分配的内存不是很小?小于896MB。
这个好像是取决于你调用时候传的参数
4:如果用户空间申请内存,又是在哪个区申请呢?
这里好像是优先从高端内存中分

humjb_1983 发表于 2014-07-05 13:34

1、概念不同,这里区是指物理内存,你说的3-4G是虚拟地址空间。

2、ZONE_HIGHMEM可以映射到内核地址空间中,通过vmalloc或其它方式。但通常情况下,内核使用低端内存。

3、kmalloc取决于传入的flag,不同的flag,内存的分配策略不一样。

4、用户空间申请内存,通常标记为GFP_USER,默认先从高端内存中分配。

daxiguagg 发表于 2014-07-06 08:04

回复 2# super皮波


    留出一部分线性空间(3G+896M - 4G,大约120M左右),用于做高端映射,这部分空间比较灵活
////////////////////////////////////////////////////////////////////////////////////////////
留出的128M内核线性空间用于高端内存映射,是不是能映射的高端内存也只有128M???

humjb_1983 发表于 2014-07-06 10:04

daxiguagg 发表于 2014-07-06 08:04 static/image/common/back.gif
回复 2# super皮波



是的,能映射高端内存的内核地址空间只有128M,从896M-1024M。
但这仅对于32位的情况,64位情况不同。。。

daxiguagg 发表于 2014-07-06 11:18

还有个问题,linux内核内存不分页,也就是不会交换到磁盘。那如果机器物理内存是512MB,在3-4G内核虚拟地址上,又怎么映射呢?

super皮波 发表于 2014-07-06 11:38

实际有不到120M的空间,128M的空间中有一些空洞,这部分就是高端内存
回复 4# daxiguagg


   
页: [1]
查看完整版本: 请教关于内核把页划分为不同的区的问题?