Basically, you have to build a library that can be used to provide recoverability for a certain chunk of a process's address space. The API offered by the library will be similar to what RVM provides, but we will simplify it to some extent to make the programming effort easier. In particular, the following simplifications can be made.
Recoverable data is read from files.
The redo log is also written out into a file. Your implementation should always provide recovery and should flush the redo log synchronously before a commit call returns. In the demonstration that you do to show that your implementation works correctly, you will have to handle crashes of the application processes that access recoverable memory. You do not need to worry about node crashes. This should take care of the problem of not knowing if flushed redo log data really has been moved to disk or not.