回调内存访问?

时间:2011-06-02 06:58:27

标签: c++ c linux memory kernel

当访问内存(读取或写入)时,是否存在分配某些内存并进行某种回调(是指向函数或信号的指针)的方法?

例如,如果我说分配1mb的内存,我想有办法在访问任何1mb时调用一个函数。

我正在研究的平台是x86 Linux,用C / C ++编写。

4 个答案:

答案 0 :(得分:7)

是的,有。

使用mprotect(2)系统调用(请参阅:http://linux.die.net/man/2/mprotect)在页面上设置只读或无访问内存保护,并设置将在访问内存时调用的SIGEGVsignal处理程序。

请注意,您需要在信号处理程序中使用mprotect,以便在调用信号处理程序后实际允许内存访问,并且当您在不知情的情况下打开窗口以访问内存时,例如来自一个不同的线程。根据您的具体用途,这可能是也可能不是问题。

答案 1 :(得分:3)

你可以使用自己版本的“安全指针”类,它将包装已分配的指针,顺便说一下,它将有一个dereference运算符的实现。但是,它需要使用它来分配原因。

这些内容:

// based on pretty standard auto_ptr
template <class T> class auto_ptr
{
    T* ptr;
public:
    explicit auto_ptr(T* p = 0) : ptr(p) {}
    ~auto_ptr()                 {delete ptr;}
    T& operator*()              {return *ptr;}   // <<--- add your stuff here
    T* operator->()             {return ptr;} // <<--- and here
    // .
};

答案 2 :(得分:1)

我认为没有这样的API可以这样做,直到你在分配的内存周围创建一个包装器对象,然后通过这个包装器对象访问内存。然后,这个包装器对象将能够看到对底层内存的所有访问。

答案 3 :(得分:0)

嗯....你可以设置一个缓冲区。您甚至可以使用分配设置一个数组。然后设置一个if语句,如果有任何东西篡改该数组部分,例如,如果数组默认在索引处具有值0,而现在不是,则调用您想要执行的任何操作。

如果你想要发生很多事情,然后程序中断并响应被篡改的分配,设置一个布尔值,当值改变时,布尔值变为true,并发布一个函数来检查该布尔值