Auxiliary library for kernel development
Go to file
Alex Kotov 615e66b5da
Merge branch 'master' into spinlock
2022-12-21 11:06:37 +04:00
.github Fix printf hack in the bindings (#152) 2022-12-18 09:18:55 +04:00
bindings Fix printf hack in the bindings (#152) 2022-12-18 09:18:55 +04:00
build Improve build system (#153) 2022-12-19 12:40:13 +04:00
examples Merge branch 'master' into spinlock 2022-12-19 13:26:05 +04:00
fixtures Print Multiboot 2 ELF section headers (#154) 2022-12-19 15:59:08 +04:00
include Merge branch 'master' into spinlock 2022-12-21 11:06:37 +04:00
libc Maintenance (#129) 2022-12-04 01:44:40 +04:00
m4 Split Make file into subdirectories (#48) 2022-06-10 08:23:03 +03:00
make OpenBSD CI (#143) 2022-12-13 06:55:09 +04:00
pkgs/freebsd FreeBSD port (#155) 2022-12-20 11:12:30 +04:00
src Merge branch 'master' into spinlock 2022-12-21 11:06:37 +04:00
tests Print Multiboot 2 ELF section headers (#154) 2022-12-19 15:59:08 +04:00
vendor Remove build configs (#133) 2022-12-06 06:28:43 +04:00
.cirrus.yml FreeBSD port (#155) 2022-12-20 11:12:30 +04:00
.gitignore Improve build system (#153) 2022-12-19 12:40:13 +04:00
.gitmodules Remove build configs (#133) 2022-12-06 06:28:43 +04:00
.openbsd.yml Fix typo & test fixtures on CI (#151) 2022-12-17 16:46:03 +04:00
AUTHORS Fix AUTHORS 2022-01-16 12:24:54 +05:00
CONTRIBUTING.md Maintenance (#114) 2022-12-01 19:42:43 +00:00
COPYING Main: COPYING: add Embedded Artistry LLC 2022-06-17 23:47:42 +03:00
ChangeLog Print Multiboot 2 ELF section headers (#154) 2022-12-19 15:59:08 +04:00
Makefile.am Merge branch 'master' into spinlock 2022-12-19 13:26:05 +04:00
NEWS Fix: Bump version (0.2.0) 2022-01-24 00:04:21 +05:00
NEWS.md Bump version (0.6.1) [1/2] 2022-12-05 17:46:41 +04:00
README Initial commit 2020-11-27 14:29:28 +05:00
README.md Merge branch 'master' into spinlock 2022-12-19 13:26:05 +04:00
VERSION Bump version (0.6.1) [1/2] 2022-12-05 17:46:41 +04:00
VERSION_SO Shared library (#144) 2022-12-14 11:03:47 +04:00
autogen.sh Main: autogen.sh: enable warnings 2022-06-09 04:37:25 +03:00
configure.ac Merge branch 'master' into spinlock 2022-12-19 13:26:05 +04:00
sha256sums.txt Bump version (0.6.1) [2/2] 2022-12-05 17:55:46 +04:00

README.md

libkernaux

Build status Build status (FreeBSD)

Auxiliary library for kernel development.

Topic on OSDev.org forum.

Table of contents

API

Headers

We use semantic versioning for stable APIs. Stable APIs may only change when major version number is increased (or minor while major is zero). Work-in-progress APIs can change at any time.

Definitions

#define the following C preprocessor macros before including <kernaux.h> and <kernaux/*.h> files. They have effect on your code, not the library code.

  • KERNAUX_DEBUG - enable assertions.
  • KERNAUX_ACCESS_PRIVATE - disable access modifier "private". Don't do this!
  • KERNAUX_ACCESS_PROTECTED - disable access modifier "protected". Only do this in a file where you implement an inherited type.
  • KERNAUX_BITFIELDS - enable bitfields in packed structs. It doesn't follow the C standard and may be incompatible with some compilers.

Global variables

// in <kernaux/assert.h>
void (*kernaux_assert_cb)(const char *file, int line, const char *msg)

Assertion callback. It's better to always set it to some function which always interrupts the execution, even when debugging is disabled. It may for example call abort() in hosted environment, raise an exception in Ruby, panic in Rust or power off the machine in freestanding environment. It may also log the error location and message.

Configuration

Because this library has no external dependencies, we use autoconf features to control behavior of the library, and packages to choose it's components. Configuration options also follow the semantic versioning scheme and are split into stable and work-in-progress ones. Here we cover only stable options.

Non-default options

Features

  • --enable-checks - enable usual tests and examples
  • --enable-checks-all - enable all checks
  • --enable-checks-cppcheck - enable cppcheck
  • --enable-checks-pthreads - enable tests that require pthreads
  • --enable-checks-python - enable tests that require Python 3 with YAML and Jinja2
  • --enable-fixtures - enable fixtures for tests and bindings

Packages

  • --with-libc - provides the replacement for some standard C functions. Useful in freestanding environment, where no libc is present.

Default options

Features

  • --(enable|disable)-debug - debugging
  • --(enable|disable)-float - floating-point arithmetic
  • --(enable|disable)-werror - fail on warning (CFLAGS+='-Werror')

Packages

All packages are included by default. To exclude all packages except those explicitly included, use --without-all.

  • --with[out]-arch-all - all architectures
  • --with[out]-arch-i386 - architecture i386
  • --with[out]-arch-riscv64 - architecture riscv64
  • --with[out]-arch-x86-64 - architecture x86-64
  • --with[out]-asm - kernel assembler helpers
  • --with[out]-cmdline - command line parser
  • --with[out]-free-list - free list memory allocator
  • --with[out]-memmap - memory map
  • --with[out]-multiboot2 - Multiboot 2 utils
  • --with[out]-ntoa - itoa/ftoa
  • --with[out]-spinlock - spinlock
  • --with[out]-printf - printf

Tips

Installation

./autogen.sh # if present
./configure
make
sudo make install
sudo ldconfig # on GNU/Linux

This is just a usual library. You can use most of it's APIs in hosted environment.

Development

./autogen.sh # if present
./configure --enable-fixtures --enable-checks # or --enable-checks-all, but see prerequisites
make

You can test with make check.

See also

Cross

Create configuration script with ./autogen.sh (if present).

Let's assume that your target triplet is i386-elf. Configure with cross-compiler in $PATH to make without it in $PATH:

./configure \
  --host='i386-elf' \
  --disable-shared \
  --enable-freestanding \
  --with-libc \
  CC="$(which i386-elf-gcc)"

The variables include AR, AS, CC, CCAS, LD, NM, OBJDUMP, RANLIB, STRIP. See the generated config.log for more information.

To install into specific directory use full path: DESTDIR="$(pwd)/dest" make install instead of DESTDIR=dest make install.

Check if compilation targets i386: objdump -d src/asm/i386.o. It should output something like this:

src/asm/i386.o:     file format elf32-i386


Disassembly of section .text:

00000000 <kernaux_asm_i386_read_cr0>:
   0:   0f 20 c0              mov    %cr0,%eax
   3:   c3                    ret

00000004 <kernaux_asm_i386_read_cr4>:
   4:   0f 20 e0              mov    %cr4,%eax
   7:   c3                    ret

00000008 <kernaux_asm_i386_write_cr0>:
   8:   8b 44 24 04           mov    0x4(%esp),%eax
   c:   0f 22 c0              mov    %eax,%cr0
   f:   c3                    ret

00000010 <kernaux_asm_i386_write_cr3>:
  10:   8b 44 24 04           mov    0x4(%esp),%eax
  14:   0f 22 d8              mov    %eax,%cr3
  17:   c3                    ret

00000018 <kernaux_asm_i386_write_cr4>:
  18:   8b 44 24 04           mov    0x4(%esp),%eax
  1c:   0f 22 e0              mov    %eax,%cr4
  1f:   c3                    ret