On Tue, 04 May 2010 10:22:44 -0600, Charles Davis cdavis@mymail.mines.edu wrote:
On 5/4/10 10:17 AM, Johann "Myrkraverk" Oskarsson wrote:
Hi all,
In the Solaris/BSD implementation of reserve_area() in libs/wine/mmap.c there is
for (i = 0; i < size; i += pagesize) if (mincore( (caddr_t)addr + i, pagesize, &vec ) != -1) break;
&vec is never used again in that function. What is the point of mincore() ?
It's trying to see if the address is valid. From the manpage:
RETURN VALUES Upon successful completion, a value of 0 is returned. Otherwise, a value of -1 is returned and errno is set to indicate the error.
ERRORS [EINVAL] addr is not a valid address for user mode.
[EFAULT] an error occurred trying to copy to the output character array vec.
vec is to make sure it failed because the address was invalid, not because it couldn't write the flags out.
Chip
It's a clever, though stop-the-world expensive way to determine which areas of the address space already have mappings present so MAP_FIXED can be used without accidentally clobbering another mapping. The strategy probably should be revisited for OpenSolaris since mmap now accepts an address hint.
-Albert