1
0
Fork 0
mirror of https://github.com/tailix/libkernaux.git synced 2024-11-13 11:04:27 -05:00
Auxiliary library for kernel development
Find a file
2022-01-14 12:23:30 +05:00
.github/workflows Revert "Build example on CI" 2022-01-12 09:58:21 +05:00
config Use vendored cross-compiler 2022-01-12 10:05:32 +05:00
examples Write code 2022-01-14 12:23:30 +05:00
include Move Multiboot 2 string functions to separate module 2022-01-14 12:23:30 +05:00
src Write code 2022-01-14 12:23:30 +05:00
tests Write code 2022-01-14 12:23:30 +05:00
vendor Add vendored RISC-V cross-compiler 2022-01-13 11:32:34 +05:00
.gitignore Add files 2022-01-14 12:23:30 +05:00
.gitmodules Add submodule "vendor/limine" 2022-01-10 06:37:43 +05:00
AUTHORS Initial commit 2020-11-27 14:29:28 +05:00
autogen.sh Add script autogen.sh 2020-11-27 16:54:13 +05:00
ChangeLog Initial commit 2020-11-27 14:29:28 +05:00
configure.ac Add framebuffer files 2022-01-11 13:58:47 +05:00
COPYING Fix copyright 2022-01-11 15:28:24 +05:00
INSTALL Initial commit 2020-11-27 14:29:28 +05:00
Makefile.am Move Multiboot 2 string functions to separate module 2022-01-14 12:23:30 +05:00
NEWS Initial commit 2020-11-27 14:29:28 +05:00
README Initial commit 2020-11-27 14:29:28 +05:00
README.md Document architectures 2022-01-13 11:35:25 +05:00

libkernaux

Test

Auxiliary library for kernel development.

Table of contents

API

Tips

Non-default options

Because this library has no external dependencies, we use autoconf features to control behavior of the library, and packages to choose it's components. Here are some non-default options:

  • --enable-assert - use value of extern variable kernaux_assert_cb as a callback function for internal assertions. You still can use assertions in your own application (kernel) even if this option was not enabled.
  • --enable-guard - safely return from functions even when assertions are disabled. This option doesn't have effect if your assetion function was set and ends execution of application (kernel). However it prevents crashes and undefined behavior in other cases. You can also separately enable or disable guards:
    • --(enable|disable)-guard-cond
    • --(enable|disable)-guard-null
  • --with-libc - provides the replacement for some standard C functions. Useful in freestanding environment, where no libc is present. You can also separately include or exclude components:
    • --with[out]-libc-memset
    • --with[out]-libc-strcpy
    • --with[out]-libc-strlen

Default options

  • --with[out]-cmdline
  • --with[out]-console
  • --with[out]-elf
  • --with[out]-framebuffer
  • --with[out]-multiboot2
  • --with[out]-pfa
  • --with[out]-units

Installation

./autogen.sh
./configure
make
sudo make install

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

Development

./autogen.sh
./configure --enable-assert --enable-guard
make

You can test with make check.

Cross

Create configuration script with ./autogen.sh.

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' \
  --enable-assert \
  --enable-guard \
  --with-libc \
  AR="$(which i386-elf-ar)" \
  CC="$(which i386-elf-gcc)" \
  RANLIB="$(which i386-elf-ranlib)" \
  CFLAGS='-ffreestanding -nostdlib -fno-builtin -fno-stack-protector'

You can see the following messages. It's a bug in autoconf, just ignore it.

checking for _Bool... no
checking stdarg.h usability... no
checking stdarg.h presence... yes
configure: WARNING: stdarg.h: present but cannot be compiled
configure: WARNING: stdarg.h:     check for missing prerequisite headers?
configure: WARNING: stdarg.h: see the Autoconf documentation
configure: WARNING: stdarg.h:     section "Present But Cannot Be Compiled"
configure: WARNING: stdarg.h: proceeding with the compiler's result
configure: WARNING:     ## ---------------------------------------------------------- ##
configure: WARNING:     ## Report this to https://github.com/tailix/libkernaux/issues ##
configure: WARNING:     ## ---------------------------------------------------------- ##
checking for stdarg.h... no
checking stddef.h usability... no
checking stddef.h presence... yes
configure: WARNING: stddef.h: present but cannot be compiled
configure: WARNING: stddef.h:     check for missing prerequisite headers?
configure: WARNING: stddef.h: see the Autoconf documentation
configure: WARNING: stddef.h:     section "Present But Cannot Be Compiled"
configure: WARNING: stddef.h: proceeding with the compiler's result
configure: WARNING:     ## ---------------------------------------------------------- ##
configure: WARNING:     ## Report this to https://github.com/tailix/libkernaux/issues ##
configure: WARNING:     ## ---------------------------------------------------------- ##
checking for stddef.h... no

When configured with cross-compiler, library can't be build and installed with just make && sudo make install. Instead use the following commands:

  • make libkernaux.a
  • sudo make install-exec install-data

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

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_hang>:
   0:   fa                    cli
   1:   f4                    hlt
   2:   eb fc                 jmp    0 <kernaux_asm_i386_hang>

00000004 <kernaux_asm_i386_read_cr0>:
   4:   0f 20 c0              mov    %cr0,%eax
   7:   c3                    ret

00000008 <kernaux_asm_i386_read_cr4>:
   8:   0f 20 e0              mov    %cr4,%eax
   b:   c3                    ret

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

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

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

Architectures

Architectures should be properly identified. We use the following scheme, but it may change in future:

  • x86
    • i386
    • x86_64
  • riscv
    • riscv64

Portability

Except GNU/Linux, the library is periodically successfully built (starting with ./autogen.sh) and tested with autoconf, automake, binutils and gcc/clang (depending on what is present) on the following operating systems:

  • FreeBSD 13.0
  • Minix 3.3.0
  • NetBSD 9.2
  • OpenBSD 7.0

Discussion