On 13/06/2019 15:03, Vincenzo Frascino wrote: > On 13/06/2019 13:28, Szabolcs Nagy wrote: >> On 13/06/2019 12:16, Vincenzo Frascino wrote: >>> On 13/06/2019 11:14, Szabolcs Nagy wrote: >>>> On 13/06/2019 10:20, Catalin Marinas wrote: >>>>> On Wed, Jun 12, 2019 at 05:30:34PM +0100, Szabolcs Nagy wrote: >>>>>> On 12/06/2019 15:21, Vincenzo Frascino wrote: >>>>>>> + - a mapping below sbrk(0) done by the process itself >>>>>> >>>>>> doesn't the mmap rule cover this? >>>>> >>>>> IIUC it doesn't cover it as that's memory mapped by the kernel >>>>> automatically on access vs a pointer returned by mmap(). The statement >>>>> above talks about how the address is obtained by the user. >>>> >>>> ok i read 'mapping below sbrk' as an mmap (possibly MAP_FIXED) >>>> that happens to be below the heap area. >>>> >>>> i think "below sbrk(0)" is not the best term to use: there >>>> may be address range below the heap area that can be mmapped >>>> and thus below sbrk(0) and sbrk is a posix api not a linux >>>> syscall, the libc can implement it with mmap or whatever. >>>> >>>> i'm not sure what the right term for 'heap area' is >>>> (the address range between syscall(__NR_brk,0) at >>>> program startup and its current value?) >>>> >>> >>> I used sbrk(0) with the meaning of "end of the process's data segment" not >>> implying that this is a syscall, but just as a useful way to identify the mapping. >>> I agree that it is a posix function implemented by libc but when it is used with >>> 0 finds the current location of the program break, which can be changed by brk() >>> and depending on the new address passed to this syscall can have the effect of >>> allocating or deallocating memory. >>> >>> Will changing sbrk(0) with "end of the process's data segment" make it more clear? >> >> i don't understand what's the relevance of the *end* >> of the data segment. >> >> i'd expect the text to say something about the address >> range of the data segment. >> >> i can do >> >> mmap((void*)65536, 65536, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED|MAP_ANON, -1, 0); >> >> and it will be below the end of the data segment. >> > > As far as I understand the data segment "lives" below the program break, hence > it is a way of describing the range from which the user can obtain a valid > tagged pointer.> > Said that, I am not really sure on how do you want me to document this (my aim > is for this to be clear to the userspace developers). Could you please propose > something? [...], it is in the memory ranges privately owned by a userspace process and it is obtained in one of the following ways: - mmap done by the process itself, [...] - brk syscall done by the process itself. (i.e. the heap area between the initial location of the program break at process creation and its current location.) - any memory mapped by the kernel [...] the data segment that's part of the process image is already covered by the last point.