【问题标题】:Overloading memory mapped file loader (C++)重载内存映射文件加载器 (C++)
【发布时间】:2015-02-20 04:03:06
【问题描述】:

是否可以重载内存映射文件加载器?如果页面错误,Linux内核不会从磁盘加载请求的数据,而是调用用户定义的函数来填充内存页面。

我想将它用于巨大的压缩光栅文件的内存映射。使用的压缩算法允许快速块解压缩。用户自定义的加载功能会逐页解压文件。

压缩文件是只读的。首选用户空间解决方案。

【问题讨论】:

  • 听起来你需要编写一个 FUSE 驱动程序。
  • 或支持挂载的各种网络文件系统的服务器
  • 在 C++ 中,您可以重载函数。重载是创建几个不同的函数,它们共享相同的名称但具有不同的类型。内存映射文件加载器是一个函数吗?它有名称或类型吗?

标签: c++ linux


【解决方案1】:

是否可以重载内存映射文件加载器?如果页面错误,Linux内核不会从磁盘加载请求的数据,而是调用用户定义的函数来填充内存页面。

这是可能的,一些图书馆就是这样做的。见libsigsegv

SIGSEGVsigaction 安装一个信号处理程序,为您的处理程序使用以下签名:

void sigsegv_handler(int, siginfo_t* si, void*) {
    si->si_addr; // Memory location which caused the page fault.
    // mmap the missing page and return here

    // On error alternatives:
    //   * restore the previous SIGSEGV handler and return (the default one dumps core), or
    //   * abort() (dumps core), or
    //   * _exit(EXIT_FAILURE).
}

【讨论】:

  • 我相信你也必须设置一点来告诉它重新运行有问题的指令。
  • @wallyk 那会是什么?
  • 自从我上次研究信号处理(如 1995 年)以来,语义似乎发生了变化。如果使用标志 SA_RESTART 调用 sigaction(),则该指令在处理程序退出后重新启动。否则,可能会跳过该指令。
  • @wallyk 我的印象是SA_RESTART 只会让一些系统调用自动重启,而不是因为EINTR 而失败。操作系统的正常行为是在信号处理程序返回时继续。因此,如果SIGSEGV 信号处理程序返回而不映射错误页面,则可能进入无限循环。
  • 操作系统如何“跳过”架构上的指令,例如x86 指令的长度可以从一个字节到十几个字节不等?它需要使用诸如反汇编器之类的东西来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多