I've decided to forgo the lazy route of calling kernel functions from user space and actually expand the system call layer. In addition, I added support for the RTL8139 networking card, and Intel E1000 series support is on the way.
I also recently expanded the kernel initialization process with a process in 16-bit mode that checks memory function by allocating and reading a string in RAM. If it fails, a solid green screen is outputted and the kernel halts. If it succeeds, 32-bit mode loads and the boot continues. This will prevent the RAM errors from showing up later in runtime, which could cause data loss.
This process also, in a way, mimics how MS-DOS and Windows 9x booted.