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 | }
|
---|