mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-30 09:23:31 +00:00
Automatically merge adjacent and compatible VmMapping
s
This commit is contained in:
committed by
Junyang Zhang
parent
c5d57d5216
commit
f442cc6d81
@ -5,7 +5,8 @@
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include "../test.h"
|
||||
|
||||
#define PAGE_SIZE 4096
|
||||
@ -106,3 +107,54 @@ FN_TEST(mmap_and_mremap_fixed)
|
||||
TEST_SUCC(munmap(addr1, PAGE_SIZE));
|
||||
}
|
||||
END_TEST()
|
||||
|
||||
FN_TEST(mmap_and_mremap_auto_merge_anon)
|
||||
{
|
||||
char *addr = CHECK_MM(mmap(NULL, 6 * PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
||||
TEST_SUCC(munmap(addr, 6 * PAGE_SIZE));
|
||||
|
||||
CHECK_MM(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
|
||||
strcpy(addr, content);
|
||||
CHECK_MM(mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
|
||||
CHECK_MM(mmap(addr + PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0));
|
||||
|
||||
char *new_addr = CHECK_MM(mremap(addr, 3 * PAGE_SIZE, 3 * PAGE_SIZE,
|
||||
MREMAP_MAYMOVE | MREMAP_FIXED,
|
||||
addr + 3 * PAGE_SIZE));
|
||||
TEST_RES(strcmp(new_addr, content), _ret == 0);
|
||||
TEST_SUCC(munmap(new_addr, 3 * PAGE_SIZE));
|
||||
}
|
||||
END_TEST()
|
||||
|
||||
FN_TEST(mmap_and_mremap_auto_merge_file)
|
||||
{
|
||||
const char *filename = "mremap_test_file";
|
||||
int fd = TEST_SUCC(open(filename, O_CREAT | O_RDWR, 0600));
|
||||
TEST_SUCC(ftruncate(fd, 6 * PAGE_SIZE));
|
||||
|
||||
char *addr = CHECK_MM(mmap(NULL, 6 * PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE, fd, 0));
|
||||
TEST_SUCC(munmap(addr, 6 * PAGE_SIZE));
|
||||
|
||||
CHECK_MM(mmap(addr, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_FIXED, fd, 0));
|
||||
strcpy(addr, content);
|
||||
CHECK_MM(mmap(addr + 2 * PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_FIXED, fd, 2 * PAGE_SIZE));
|
||||
CHECK_MM(mmap(addr + PAGE_SIZE, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_FIXED, fd, PAGE_SIZE));
|
||||
|
||||
char *new_addr = CHECK_MM(mremap(addr, 3 * PAGE_SIZE, 3 * PAGE_SIZE,
|
||||
MREMAP_MAYMOVE | MREMAP_FIXED,
|
||||
addr + 3 * PAGE_SIZE));
|
||||
TEST_RES(strcmp(new_addr, content), _ret == 0);
|
||||
TEST_SUCC(munmap(new_addr, 3 * PAGE_SIZE));
|
||||
|
||||
close(fd);
|
||||
unlink(filename);
|
||||
}
|
||||
END_TEST()
|
||||
|
Reference in New Issue
Block a user