> On Dec 3, 2020, at 4:06 AM, Topi Miettinen <[email protected]> wrote:
> 
> On 3.12.2020 11.47, Florian Weimer wrote:
>> * Topi Miettinen:
>>> +3   Additionally enable full randomization of memory mappings created
>>> +    with mmap(NULL, ...). With 2, the base of the VMA used for such
>>> +    mappings is random, but the mappings are created in predictable
>>> +    places within the VMA and in sequential order. With 3, new VMAs
>>> +    are created to fully randomize the mappings.
>>> +
>>> +    Also mremap(..., MREMAP_MAYMOVE) will move the mappings even if
>>> +    not necessary and the location of stack and vdso are also
>>> +    randomized.
>>> +
>>> +    On 32 bit systems this may cause problems due to increased VM
>>> +    fragmentation if the address space gets crowded.
>> Isn't this a bit of an understatement?  I think you'll have to restrict
>> this randomization to a subregion of the entire address space, otherwise
>> the reduction in maximum mapping size due to fragmentation will be a
>> problem on 64-bit architectures as well (which generally do not support
>> the full 64 bits for user-space addresses).
> 
> Restricting randomization would reduce the address space layout randomization 
> and make this less useful. There's 48 or 56 bits, which translate to 128TB 
> and 64PB of VM for user applications. Is it really possible to build today 
> (or in near future) a system, which would contain so much RAM that such 
> fragmentation could realistically happen? Perhaps also in a special case 
> where lots of 1GB huge pages are necessary? Maybe in those cases you 
> shouldn't use randomize_va_space=3. Or perhaps there could be 
> randomize_va_space=3 which does something, and randomize_va_space=4 for those 
> who want maximum randomization.

If you want a 4GB allocation to succeed, you can only divide the address space 
into 32k fragments.  Or, a little more precisely, if you want a randomly 
selected 4GB region to be empty, any other allocation has a 1/32k chance of 
being in the way.  (Rough numbers — I’m ignoring effects of the beginning and 
end of the address space, and I’m ignoring the size of a potential conflicting 
allocation.). This sounds good, except that a program could easily make a whole 
bunch of tiny allocations that get merged in current kernels but wouldn’t with 
your scheme.

So maybe this is okay, but it’s not likely to be a good default.

> 
>>> +    On all systems, it will reduce performance and increase memory
>>> +    usage due to less efficient use of page tables and inability to
>>> +    merge adjacent VMAs with compatible attributes. In the worst case,
>>> +    additional page table entries of up to 4 pages are created for
>>> +    each mapping, so with small mappings there's considerable penalty.
>> The number 4 is architecture-specific, right?
> 
> Yes, I only know x86_64. Actually it could have 5 level page tables. I'll fix 
> this in next version.
> 
> -Topi

Reply via email to