feat(sys): add malloc

This commit is contained in:
2026-04-21 01:25:06 +02:00
parent 4cacdeb012
commit 729772ccbe
6 changed files with 73 additions and 7 deletions

View File

@@ -21,7 +21,8 @@ add_library(
sys STATIC sys STATIC
${CMAKE_CURRENT_SOURCE_DIR}/src/sys/entry.s ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/entry.s
${CMAKE_CURRENT_SOURCE_DIR}/src/sys/syscall.s ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/syscall.s
${CMAKE_CURRENT_SOURCE_DIR}/src/sys/syscall.c) ${CMAKE_CURRENT_SOURCE_DIR}/src/sys/syscall.c
${CMAKE_CURRENT_SOURCE_DIR}/src/sys/memory.c)
target_include_directories( target_include_directories(
sys PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> sys PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>) $<INSTALL_INTERFACE:include>)
@@ -29,8 +30,9 @@ target_include_directories(
add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c) add_executable(nolibc ${CMAKE_CURRENT_SOURCE_DIR}/app/nolibc.c)
target_link_libraries(nolibc PRIVATE sys) target_link_libraries(nolibc PRIVATE sys)
target_compile_options( target_compile_options(
nolibc PRIVATE -fno-asynchronous-unwind-tables -fno-unwind-tables nolibc
-fno-stack-protector -ffunction-sections -fdata-sections) PRIVATE -fno-asynchronous-unwind-tables -fno-unwind-tables
-fno-stack-protector -ffunction-sections -fdata-sections -fno-builtin)
target_link_options( target_link_options(
nolibc nolibc
PRIVATE PRIVATE

View File

@@ -1,6 +1,19 @@
#include <c-libs/sys/memory.h>
#include <c-libs/sys/syscall.h> #include <c-libs/sys/syscall.h>
void strcpy(char *dst, const char *src) {
int ix = 0;
do {
dst[ix] = src[ix];
} while (src[ix++]);
}
int main() { int main() {
write(0, "Hello World!\n", 13); char *str = malloc(14);
strcpy(str, "Hello World!\n");
write(0, str, 13);
munmap(str, 14);
return 0; return 0;
} }

View File

@@ -0,0 +1,17 @@
#ifndef CLIBS_SYS_MEMORY_H
#define CLIBS_SYS_MEMORY_H
#include <c-libs/sys/syscall.h>
#include <linux/mman.h>
void *malloc(__u64 size);
#endif
#ifdef CLIBS_SYS_MEMORY_IMPL
void *malloc(__u64 size) {
return mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1,
0);
}
#endif

View File

@@ -1,14 +1,22 @@
#ifndef CLIBS_SYS_SYSCALL_H #ifndef CLIBS_SYS_SYSCALL_H
#define CLIBS_SYS_SYSCALL_H #define CLIBS_SYS_SYSCALL_H
#include <asm/types.h> #include <linux/types.h>
#include <asm/unistd.h> #include <linux/unistd.h>
void *syscall5(void *number, void *arg1, void *arg2, void *arg3, void *arg4, void *syscall5(void *number, void *arg1, void *arg2, void *arg3, void *arg4,
void *arg5); void *arg5);
void *syscall6(void *number, void *arg1, void *arg2, void *arg3, void *arg4,
void *arg5, void *arg6);
__s64 write(int fd, void const *data, __u64 nbytes); __s64 write(int fd, void const *data, __u64 nbytes);
void *mmap(void *addr, __u64 len, __u64 prot, __u64 flags, __u64 fd,
__s64 offset);
int munmap(void *addr, __u64 len);
#endif #endif
#ifdef CLIBS_SYS_SYSCALL_IMPL #ifdef CLIBS_SYS_SYSCALL_IMPL
@@ -18,4 +26,17 @@ __s64 write(int fd, void const *data, __u64 nbytes) {
(void *)nbytes, 0, 0); (void *)nbytes, 0, 0);
} }
void *mmap(void *addr, __u64 len, __u64 prot, __u64 flags, __u64 fd,
__s64 offset) {
return syscall6((void *)__NR_mmap, (void *)addr, (void *)len, (void *)prot,
(void *)flags, (void *)fd, (void *)offset);
}
int munmap(void *addr, __u64 len) {
long val = (long)syscall5((void *)__NR_munmap, addr, (void *)len, (void *)0,
(void *)0, (void *)0);
return (int)val;
}
#endif #endif

2
src/sys/memory.c Normal file
View File

@@ -0,0 +1,2 @@
#define CLIBS_SYS_MEMORY_IMPL
#include <c-libs/sys/memory.h>

View File

@@ -1,4 +1,4 @@
.global syscall5 .global syscall5, syscall6
syscall5: syscall5:
mov %rdi, %rax /* %rax (syscall number) = func param 1 (%rdi) */ mov %rdi, %rax /* %rax (syscall number) = func param 1 (%rdi) */
@@ -10,4 +10,15 @@ syscall5:
syscall /* Enter a syscall (return value in %rax) */ syscall /* Enter a syscall (return value in %rax) */
ret /* Return value is already in %rax, we can return. */ ret /* Return value is already in %rax, we can return. */
syscall6:
mov %rdi, %rax /* %rax (syscall number) = func param 1 (%rdi) */
mov %rsi, %rdi /* %rdi (syscall param 1) = func param 2 (%rsi) */
mov %rdx, %rsi /* %rsi (syscall param 2) = func param 3 (%rdx) */
mov %rcx, %rdx /* %rdx (syscall param 3) = func param 4 (%rcx) */
mov %r8, %r10 /* %r10 (syscall param 4) = func param 5 (%r8) */
mov %r9, %r8 /* %r8 (syscall param 5) = func param 6 (%r9) */
mov 8(%rsp), %r9 /* %r9 (syscall param 6) = stack-value */
syscall /* Enter a syscall (return value in %rax) */
ret /* Return value is already in %rax, we can return. */
.section .note.GNU-stack,"",@progbits .section .note.GNU-stack,"",@progbits