【发布时间】:2011-09-06 20:58:16
【问题描述】:
当内存被访问(读取或写入)时,是否存在分配一些内存并进行某种回调(无论是指向函数还是信号的指针)的方法?
例如,如果我说分配 1mb 的内存,我希望有一种方法可以在访问任何 1mb 时调用函数。
我正在开发的平台是 x86 Linux,使用 C/C++ 编写。
【问题讨论】:
当内存被访问(读取或写入)时,是否存在分配一些内存并进行某种回调(无论是指向函数还是信号的指针)的方法?
例如,如果我说分配 1mb 的内存,我希望有一种方法可以在访问任何 1mb 时调用函数。
我正在开发的平台是 x86 Linux,使用 C/C++ 编写。
【问题讨论】:
是的,有。
使用 mprotect(2) 系统调用(请参阅:http://linux.die.net/man/2/mprotect)在页面上设置只读或不访问内存保护,并设置将在访问内存时调用的 SIGEGVsignal 处理程序。
请注意,一旦调用了信号处理程序,您将需要在信号处理程序中使用 mprotect 来实际允许内存访问,并且当您这样做时,您会在不知情的情况下打开一个窗口以访问内存,例如从一个不同的线程。这可能是也可能不是问题,具体取决于您的具体使用情况。
【讨论】:
嗯....你可以设置一个缓冲区。您甚至可以使用分配设置一个数组。然后设置一个 if 语句,如果有任何东西篡改了该数组部分,例如,如果数组在索引处的默认值为 0,而现在它不是,则调用您想要执行的任何操作。
如果您希望发生很多事情,然后程序中断并响应该分配被篡改,请设置一个布尔值,当值更改时,该布尔值变为真,并发布一个函数来检查该布尔值.
【讨论】:
我认为没有这样的 API 可以做到这一点,直到您在分配的内存周围创建一个包装器对象,然后通过此包装器对象完成对内存的访问。然后这个包装器对象将能够看到对底层内存的所有访问。
【讨论】:
您可以使用您自己的“安全指针”类的版本,该类将包装分配的指针,顺便说一下,将实现取消引用运算符。但是,它需要使用它来进行分配。
以下几行:
// 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
// .
};
【讨论】: