1.7 KiB
Name
Kernel Modules - runtime code loading for the kernel
Description
Serenity's kernel supports loading modules at runtime. This functionality can be used to implement optional features (e.g. drivers), and speed up your development cycle.
Module format
A kernel module is a regular ELF object file which must export several symbols. Any symbols it refers to will be resolved when it is loaded.
module_name
This should be a string like const char module_name[]
containing the name of
the module. This is used to give the module a name in any informational
contexts, but also to ensure that the module is not loaded twice by accident,
and also used as a reference to unload the module later.
module_init
This should be a function with the following signature: void module_init()
.
It will be called when the module is loaded.
module_fini
This is optional, but if defined it should be a function with the following
signature: void module_fini()
. It will be called when the module is
unloaded.
Example:
#include <Kernel/kstdio.h>
#include <Kernel/Process.h>
extern "C" const char module_name[] = "ExampleModule";
extern "C" void module_init()
{
kprintf("ExampleModule has booted!\n");
for (int i = 0; i < 3; ++i) {
kprintf("i is now %d\n", i);
}
kprintf("current pid: %d\n", current->process().sys$getpid());
kprintf("current process name: %s\n", current->process().name().characters());
}
extern "C" void module_fini()
{
kprintf("ExampleModule is being removed!\n");
}