KimisOS/docs/modules.md

6.0 KiB

Kernel Modules

Kernel modules are special pieces of software loaded into kernelspace, and persisting along with the kernel among all processes. These can be loaded at both runtime and during boot time. Boot time modules must be contained within the initrd, or be loaded by the initrc by a mounted filesystem.

The API

When a module starts, two arguments are passed to it: The API's function pointer, and the version number. It is suggested that modules check the version number to make sure they are compatible with the API. Currently, all modules should check to make sure that the version number is 0. Any number other than zero should be assumed incompatible, and the module should exit.

It is expected that every module calls MODULE_API_REGISTER, to obtain a key, which is required for certain operations, or making sure that the correct information is assigned to the correct module.

API Functions

MODULE_API_ADDFUNC

Unused. Treated as no-op

MODULE_API_REGISTER

Arguments: module_t *structure

Obtains a key, returned in the structure structure. Structure argument shall reference a variable within the module of type module_t. Returns -1 if structure is null. Returns 0 on success

MODULE_API_ADDINT

Arguments: uint32_t interrupt_index, uint32_t key, void (*interrupt_handler)(register_t* registers)

Registers an interrupt handler to handle the IRQ corresponding with interrupt_index. Returns -1 if interrupt_index is above or equal to 16 or below 0. Returns 0 on success.

MODULE_API_DELINT

Arguments: uint32_t interrupt_index, uint32_t key

Deletes interrupt handler for IRQ interrupt_index. Returns -1 if the module does not own the interrupt handler.

MODULE_API_PRINT

Arguments: char *name, char* string, ...

Prints a formatted string attributed to name.

MODULE_API_READ

Arguments: vfile_t *file, char *buffer, uint32_t offset, uint32_t count

Reads count bytes from file into buffer starting at offset. Returns number of bytes read.

MODULE_API_WRITE

Arguments: vfile_t *file, char *buffer, uint32_t offset, uint32_t count

Writes count bytes from buffer into file starting at offset. Returns number of bytes written.

MODULE_API_CREAT

Arguments: char *name, VFILE_TYPE ftype, void *arg1, void *arg2

Creates a file using the arguments arg1 and arg2.

If ftype is either of the following: VFILE_POINTER, VFILE_DIRECTORY, VFILE_MOUNT, or VFILE_SYMLINK,

arg1 corresponds to a pointer to data, arg2 is unused.

If ftype is either of the following: VFILE_FILE, or VFILE_DEVICE

arg1 corresponds to the read function, and arg2 corresponds to the write function

Returns the pointer to the new file in memory.

MODULE_API_DELET

Not implemented, yet. Always returns -1.

MODULE_API_OPEN

Arguments: char *name

Returns pointer to file in memory. If file does not exist, returns NULL

MODULE_API_MAP

Arguments: void *vaddr, void *paddr, uint32_t flags

Maps physical address paddr to virtual address vaddr, Returns 0.

flags corresponds to the page flags.

MODULE_API_UNMAP

Arguments: void *addr

Unmaps addr from memory. Accesses to this memory after calling MODULE_API_UNMAP will result in a page fault.

MODULE_API_PADDR

Arguments: void *addr

Returns the physical address associated with the address addr.

MODULE_API_MALLOC

Arguments: uint32_t sz_pages

Allocates sz_pages pages of contiguous virtual memory. Returns pointer to the newly allocated memory.

MODULE_API_FREE

Arguments: void *addr

Deallocates memory in addr. Returns NULL

MODULE_API_PMALLOC64K

No Arguments.

Allocates 64kb of contiguous physical memory and returns the physical address.

MODULE_API_KMALLOC_PADDR

Arguments: void *paddr, uint32_t size

Allocates size pages starting at physical address paddr. Returns virtual address.

MODULE_API_MESSAGE_HANDLER

Arguments: uint32_t key, void (*handler)(uint32_t message, ...)

Assigns and marks valid message handler to recieve messages from the kernel to kernel modules. Returns -1 if the key is invalid, otherwise, returns 0. No messages have been implemented, but a will update with a table of messages as necessary.

If a message handler cannot handle a message, it is required that the message handler returns -1.

MODULE_API_BLOCK_PID

Arguments: uint32_t pid

Sets the process pid as blocked, and will not run until set unblocked.

MODULE_API_UNBLOCK_PID

Arguments: uint32_t pid

Sets the process pid as unblocked, and will resume execution after the current queue has finished executing.

MODULE_API_GET_CPID

Arguments:

Obtains the ID of the current executing process.

MODULE_API_GET_INTERRUPT

Arguments:

Asks the interrupt handler whether or not it considers itself to be in an interrupt. Returns 1 if true.

Deprecated, but probably won't be removed for now.