| 1 | #include <stdio.h> // for printf()
|
|---|
| 2 |
|
|---|
| 3 | #include <unistd.h> // for getpagesize()
|
|---|
| 4 | #include <sys/mman.h> // for mmap()
|
|---|
| 5 |
|
|---|
| 6 | #include <sstream>
|
|---|
| 7 |
|
|---|
| 8 | #include <boost/archive/text_oarchive.hpp>
|
|---|
| 9 |
|
|---|
| 10 | int
|
|---|
| 11 | main(int argc, char**argv)
|
|---|
| 12 | {
|
|---|
| 13 | // Get the page size.
|
|---|
| 14 | int pageSize = ::getpagesize();
|
|---|
| 15 | ::printf("pageSize = %d\n", pageSize);
|
|---|
| 16 |
|
|---|
| 17 | // Allocate a page of zeroes in a lonely part of the address space.
|
|---|
| 18 | char* addr = (char*) ::mmap(0, pageSize, PROT_READ|PROT_WRITE,
|
|---|
| 19 | MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|---|
| 20 | ::printf("addr = %p\n", addr);
|
|---|
| 21 |
|
|---|
| 22 | // Serialize the last few bytes of the page.
|
|---|
| 23 | std::stringstream str;
|
|---|
| 24 | boost::archive::text_oarchive oar(str);
|
|---|
| 25 | oar.save_binary(addr + (pageSize-8), 8);
|
|---|
| 26 |
|
|---|
| 27 | return 0;
|
|---|
| 28 |
|
|---|
| 29 | //These cause an address fault:
|
|---|
| 30 | //oar.save_binary(addr + (pageSize-4), 4);
|
|---|
| 31 | //oar.save_binary(addr + (pageSize-8), 8);
|
|---|
| 32 | //oar.save_binary(addr + (pageSize-16), 16);
|
|---|
| 33 | //oar.save_binary(addr, pageSize);
|
|---|
| 34 |
|
|---|
| 35 | //These don't:
|
|---|
| 36 | //oar.save_binary(addr + (pageSize-9), 8);
|
|---|
| 37 | //oar.save_binary(addr + (pageSize-8), 7);
|
|---|
| 38 | //oar.save_binary(addr + (pageSize-17), 16);
|
|---|
| 39 | //oar.save_binary(addr + (pageSize-16), 15);
|
|---|
| 40 | //oar.save_binary(addr, pageSize-1);
|
|---|
| 41 | }
|
|---|