1 / 32

dbt 对 mmap 的处理

dbt 对 mmap 的处理. mmap 简介. 作用 一个进程可以通过系统调用 mmap () ,将一个已打开的文件的内容映射到它的用户空间,然后用户可以像访问内存一样访问文件 函数原型 void * mmap (void *start, size_t length, int prot , int flags, int fd , off_t offset);. flags 指定了映射方式: Fixed / Anonymous / ( Private 或 shared ). prot 指定了这块内存空间的属性: W/R/X/NONE.

fadey
Download Presentation

dbt 对 mmap 的处理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. dbt对mmap的处理

  2. mmap简介 • 作用 • 一个进程可以通过系统调用mmap(),将一个已打开的文件的内容映射到它的用户空间,然后用户可以像访问内存一样访问文件 • 函数原型 • void * mmap(void *start, size_t length, intprot , int flags, intfd, off_t offset);

  3. flags指定了映射方式: Fixed / Anonymous/(Private 或shared) prot指定了这块内存空间的属性:W/R/X/NONE (有可能是start) 文件偏移off必须是页大小的整数倍

  4. 如果访问这段空间会出现什么情况? SIGBUS

  5. dbt对mmap的模拟 • 需要对mmap进行模拟的原因是:龙芯页大小为16K,x86为4K

  6. dbt对mmap的模拟 • 遇到的问题1 • 在x86上每页都会有一个页属性(R/W/X),将x86上的页映射到龙芯上时,需要x86上4个页共用龙芯上的一个页属性,所以x86上的页属性不能在龙芯上完全模拟

  7. dbt对mmap的模拟 MAP W(可写) MAP R(可读) ? W(可写)

  8. dbt对mmap的模拟 MAP W(可写) MAP R(可读) W|R(可写可读)

  9. dbt对mmap的模拟 • 所以维护的页属性是不精确的 • 但是也要尽力去维护

  10. dbt对mmap的模拟 MAP W(可写) W(可写) MAP R(可读) R(可读) W|R(可写可读) W(可写)

  11. dbt对mmap的模拟 • 遇到的问题2 • 当mmap的参数flags中包含MAP_FIXED属性时,要求参数start必须为页大小的整数倍,但是在为4K的整数倍并不能保证它是16K的整数倍,所以在龙芯上直接mmap这个地址将会失败

  12. dbt的模拟方案 • 分为以下2种情况进行解决 • flags中不包含fixed属性 • flags中包含fixed属性

  13. flags中不包含fixed属性 • start为0时 W(可写) ?

  14. flags中不包含fixed属性 • start为0时 W(可写) 分配一段空间(该空间的大小页的整数倍,即以页为单位进行分配)

  15. flags中不包含fixed属性 • start为0时 W(可写) W(可写) W(可写) W(可写) W(可写)

  16. flags中不包含fixed属性 • start不为0时 W(可写) ?

  17. flags中不包含fixed属性 • start不为0时 start W(可写) 查看以start为首地址的那段空间是否被占领了(有页属性)

  18. flags中不包含fixed属性 • start不为0时 start W(可写) W(可写) W(可写) W(可写) 没有被占领,映射上去即可

  19. flags中不包含fixed属性 • start不为0时 start W(可写) R(可读) W(可写) 被占领了,以start为0的情形进行一样的映射

  20. flags中包含fixed属性 • flags包含MAP_ANONYMOUS属性,或者start % 16K == offset % 16K W(可写) ?

  21. flags中包含fixed属性 • flags包含MAP_ANONYMOUS属性,或者start % 16K == offset % 16K start W(可写) W(可写) W(可写) W(可写) 16K地址边界 W(可写) 16K地址边界 W(可写) W(可写)

  22. flags中包含fixed属性 • 为什么不是这样映射的? start在这 W(可写) W(可写) W(可写) W(可写) 16K地址边界 W(可写) 16K地址边界 W(可写) W(可写)

  23. flags中包含fixed属性 • 怎么办? start W(可写) W(可写) W(可写) W(可写) 16K地址边界 W(可写) 16K地址边界 W(可写) 以start为首地址申请一段一样大小的空间

  24. flags中包含fixed属性 • 怎么办? start W(可写) W(可写) W(可写) W(可写) W(可写) 16K地址边界 W(可写) 16K地址边界 W(可写) 把文件内容读到相应内存里

  25. 关于mmap的处理讲完了

  26. 遇到的bug 但只有这部分内存有对应的文件内容 8K 16K 文件1 map了32K空间 16K 内存

  27. 遇到的bug 8K 16K 文件1 map了32K空间 8K 8K 16K 想映射到这里面去 文件2 内存

  28. 遇到的bug 8K 16K 文件1 map了32K空间 内存块a 8K 8K 16K 文件2 这时dbt发现这段空间被mmap映射过了,所以想直接把文件2的内容读到内存块a里去,但是失败了。。。 内存

  29. 遇到的bug 8K 16K 文件1 map了32K空间 我没有对应的物理内存! 8K 8K 16K 文件2 内存

  30. 遇到的bug 8K 16K 文件1 map了32K空间 以后对我的访问都会产生SIGBUS 8K 8K 16K 文件2 内存

  31. 遇到的bug • 以前遇到过这样的情况吗? • 没有,遇到了也会出错。

  32. Thank you!

More Related