Какое пространство VMALLOC может быть в 32-битной x86?
Моя физическая память 4G, и я использую Android x86, который является 32-битным, HIGHMEM4G включен. Я хочу максимально увеличить пространство vmalloc ().
Как я и пытался, при переходе на 2G/2G VMsplit и увеличении VMALLOC_RESERVED пространство vmalloc (), мы надеемся, может достичь 1G. Но если я хочу увеличить vmalloc (), например, 2G, возможно ли это?
Vmalloc () выделяет из ZONE_HIGHMEM и ZONE_NORMAL. Если у меня достаточно физической памяти, ZONE_HIGHMEM достаточно велик. Может ли это помочь сделать vmalloc () выше 2G? Или vmalloc () ограничен его виртуальным пространством, поэтому, если виртуальное пространство ядра составляет 2G, vmalloc () не может быть больше этого размера?
1 ответ
Вы можете приблизиться к 2G (при разделении на 2G/2G), но при этом ваша нормальная зона уменьшается.
Большинство выделений ядра выполняется из нормальной зоны, поэтому вы начнете видеть дефицит там, что приведет к серьезным проблемам.
Увеличение VMALLOC_RESERVE с 1G до 2G обычно является плохой сделкой. Например, при переходе с 1G на 1,5G вы получаете на 50% больше vmalloc, но ваша нормальная зона уменьшается вдвое. И компромисс ухудшается с приближением к 2G.
Мой лучший совет, чтобы изменить ваш код, чтобы не использовать так много vmalloc
,
Ты можешь использовать kmalloc
а также __get_free_pages
вместо.
Или вы можете подумать, зачем на самом деле так много памяти ядра.