【开发进展】mremap系统调用

已完成:

  • 拷贝旧内存区域的内容
  • 读、写重映射的新内存区域

待解决问题:

由于是通过拷贝旧内存区域的页表项到新内存区域,导致两块内存区域映射到同一块物理区域,造成内存泄漏问题

遇到个很奇怪的点,对于同一块内存区域,如果是用mmap映射的,就不会报already mapped

但是如果是通过mremap重映射的话(mremap重映射新的内存区域同样调用的是map_anonymous方法),就会出问题

这个传入的size是不是内核里面得按页面大小对齐一下。

有的,检验完参数之后就对齐了


在这里取消映射之后,试试调用translate看看对应的new_vaddr相关的那几个页表项是不是空了。我感觉可能是unmap的问题

这里我好像搞错了,因为如果没有FIXED标志的话,这里的new_vaddr实际上是0。所以实际上不会调用这里的unmap,而是直接由map_anonymous返回一块空闲的内存区域(不指定起始地址),但目前返回的是一块被映射过的内存区域。

感觉有可能是VMA的合并、分割出了bug,可以尝试打印一下当前的VMA的状态看看?

OK了,我还以为只要是空闲的虚拟内存区域就不会有对应映射的物理内存区域 。:smiling_face_with_tear:
现在就是通过map_anonymous获取到新内存区域后,取消该区域的物理页映射,然后再重新分配物理页

1 个赞

已经merge:

1 个赞