原则上堆和栈空间之间的区域,都可以被分配用来做mmap,当brk区域一直增长,可能会和某一个mmap区域重叠是有可能的。将这个重叠的mmap区域解除映射,当应用程序再次访问这个映射区域的地址时,会有问题。我感觉先nunmap掉这个映射留给堆空间,只是把问题推迟了,并没有解决问题。如果之前那个mmap区域又被访问了,应用程序还是会出问题的。
我看6.0的代码,如果发现有重叠,不会做unmap而是不再处理而推出系统调用了:
224 /* Check against existing mmap mappings. */
225 next = find_vma(mm, oldbrk);
226 if (next && newbrk + PAGE_SIZE > vm_start_gap(next))
227 goto out;
【 在 flynetcn 的大作中提到: 】
: 其实我的疑问是注释里的Clear old maps.里的old maps是怎么来的,我能想到的就是线程竞争导致了内存覆盖,因为正常逻辑走到这里就不应该有冲突。
: 发自「今日水木 on 键盘侠」
--
FROM 123.120.110.*