ye, i see.. strange choice though "lisp". i would organize memory allocator and syscalls into a separate library, like here https://codeberg.org/determin1st/sm-c-base so you kinda have libc-substitute. also your memory allocator is kinda primitive for the runtime, better to steal that one, its heap-based with groups. syscalls look almost the same, not lone enough, kek.
FFI is a different term. i called LIBC bloatware because it comes with many stuff that is not needed and things that are not appropriate for the system API layer, like memory allocator, string primitives etc. it also has an old style naming, like_this_one_supposed_to_be_nice or whtabthis1?
windows's NTDLL (at least early versions) naming is much better and the layer is much thiner, the problem is that it is "undocumented". also its rigid portability, while libc binding makes NIX software non-portable. NT also has syscalls through the interrupt btw.