Userspace: Implement basic test for MAP_SHARED
This commit is contained in:
		
							parent
							
								
									f953f3d3ff
								
							
						
					
					
						commit
						3f164c6b82
					
				|  | @ -10,6 +10,7 @@ set(USERSPACE_PROJECTS | ||||||
| 	id | 	id | ||||||
| 	init | 	init | ||||||
| 	ls | 	ls | ||||||
|  | 	mmap-shared-test | ||||||
| 	poweroff | 	poweroff | ||||||
| 	Shell | 	Shell | ||||||
| 	snake | 	snake | ||||||
|  |  | ||||||
|  | @ -0,0 +1,17 @@ | ||||||
|  | cmake_minimum_required(VERSION 3.26) | ||||||
|  | 
 | ||||||
|  | project(mmap-shared-test CXX) | ||||||
|  | 
 | ||||||
|  | set(SOURCES | ||||||
|  | 	main.cpp | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | add_executable(mmap-shared-test ${SOURCES}) | ||||||
|  | target_compile_options(mmap-shared-test PUBLIC -O2 -g) | ||||||
|  | target_link_libraries(mmap-shared-test PUBLIC libc) | ||||||
|  | 
 | ||||||
|  | add_custom_target(mmap-shared-test-install | ||||||
|  | 	COMMAND sudo cp ${CMAKE_CURRENT_BINARY_DIR}/mmap-shared-test ${BANAN_BIN}/ | ||||||
|  | 	DEPENDS mmap-shared-test | ||||||
|  | 	USES_TERMINAL | ||||||
|  | ) | ||||||
|  | @ -0,0 +1,115 @@ | ||||||
|  | #include <fcntl.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <sys/mman.h> | ||||||
|  | #include <sys/stat.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | 
 | ||||||
|  | #define FILE_NAME "test-file" | ||||||
|  | #define FILE_SIZE (1024*1024) | ||||||
|  | 
 | ||||||
|  | int prepare_file() | ||||||
|  | { | ||||||
|  | 	int fd = open(FILE_NAME, O_RDWR | O_TRUNC | O_CREAT, 0666); | ||||||
|  | 	if (fd == -1) | ||||||
|  | 	{ | ||||||
|  | 		perror("open"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void* null_buffer = malloc(FILE_SIZE); | ||||||
|  | 	memset(null_buffer, 0x00, FILE_SIZE); | ||||||
|  | 
 | ||||||
|  | 	if (write(fd, null_buffer, FILE_SIZE) == -1) | ||||||
|  | 	{ | ||||||
|  | 		perror("write"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	free(null_buffer); | ||||||
|  | 	close(fd); | ||||||
|  | 
 | ||||||
|  | 	printf("file created\n"); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int job1() | ||||||
|  | { | ||||||
|  | 	int fd = open(FILE_NAME, O_RDONLY); | ||||||
|  | 	if (fd == -1) | ||||||
|  | 	{ | ||||||
|  | 		perror("open"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void* addr = mmap(nullptr, FILE_SIZE, PROT_READ, MAP_SHARED, fd, 0); | ||||||
|  | 	if (addr == MAP_FAILED) | ||||||
|  | 	{ | ||||||
|  | 		perror("mmap"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sleep(4); | ||||||
|  | 
 | ||||||
|  | 	size_t sum = 0; | ||||||
|  | 	for (int i = 0; i < FILE_SIZE; i++) | ||||||
|  | 		sum += ((uint8_t*)addr)[i]; | ||||||
|  | 
 | ||||||
|  | 	munmap(addr, FILE_SIZE); | ||||||
|  | 	close(fd); | ||||||
|  | 
 | ||||||
|  | 	printf("sum: %zu\n", sum); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int job2() | ||||||
|  | { | ||||||
|  | 	sleep(2); | ||||||
|  | 
 | ||||||
|  | 	int fd = open(FILE_NAME, O_RDWR); | ||||||
|  | 	if (fd == -1) | ||||||
|  | 	{ | ||||||
|  | 		perror("open"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void* addr = mmap(nullptr, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); | ||||||
|  | 	if (addr == MAP_FAILED) | ||||||
|  | 	{ | ||||||
|  | 		perror("mmap"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	memset(addr, 'a', FILE_SIZE); | ||||||
|  | 
 | ||||||
|  | 	munmap(addr, FILE_SIZE); | ||||||
|  | 	close(fd); | ||||||
|  | 
 | ||||||
|  | 	printf("expecting: %zu\n", (size_t)'a' * FILE_SIZE); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  | 	if (int ret = prepare_file()) | ||||||
|  | 		return ret; | ||||||
|  | 
 | ||||||
|  | 	pid_t pid = fork(); | ||||||
|  | 	if (pid == 0) | ||||||
|  | 		return job1(); | ||||||
|  | 
 | ||||||
|  | 	if (pid == -1) | ||||||
|  | 	{ | ||||||
|  | 		perror("fork"); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int ret = job2(); | ||||||
|  | 	waitpid(pid, nullptr, 0); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue