libkernaux/README.md

261 lines
7.8 KiB
Markdown
Raw Normal View History

2020-11-27 09:28:13 +00:00
libkernaux
==========
[![Test](https://github.com/tailix/libkernaux/actions/workflows/test.yml/badge.svg)](https://github.com/tailix/libkernaux/actions/workflows/test.yml)
2021-12-13 22:36:06 +00:00
2020-11-27 09:28:13 +00:00
Auxiliary library for kernel development.
2020-11-27 13:38:58 +00:00
2020-11-28 23:52:51 +00:00
Table of contents
-----------------
* [Overview](#libkernaux)
* [Table of contents](#table-of-contents)
2020-11-30 01:21:22 +00:00
* [API](#api)
2021-12-16 08:14:39 +00:00
* [Tips](#tips)
2021-12-18 01:47:01 +00:00
* [Non-default options](#non-default-options)
2022-01-10 16:03:37 +00:00
* [Default options](#default-options)
2021-12-16 08:14:39 +00:00
* [Installation](#installation)
* [Development](#development)
2021-12-15 00:03:40 +00:00
* [Cross](#cross)
2022-01-13 06:35:25 +00:00
* [Architectures](#architectures)
2021-12-26 06:09:23 +00:00
* [Portability](#portability)
* [Discussion](#discussion)
2020-11-28 23:52:51 +00:00
2020-11-30 01:21:22 +00:00
API
---
2021-12-15 11:03:14 +00:00
* Runtime environment
* Architecture-specific code
* [Declarations](/include/kernaux/arch/)
* [Functions](/include/kernaux/asm/)
2021-12-15 11:03:14 +00:00
* [Assertions](/include/kernaux/assert.h)
2021-12-18 00:51:12 +00:00
* [Simple](/examples/assert_simple.c)
2021-12-20 02:22:43 +00:00
* [Guards](/examples/assert_guards.c)
2022-01-12 10:56:39 +00:00
* Stack trace *(planned)*
2021-12-15 15:34:02 +00:00
* Device drivers (for debugging only)
2022-01-14 05:48:29 +00:00
* [Serial console](/include/kernaux/console.h) *(work in progress)*
2022-01-11 08:58:47 +00:00
* [Framebuffer](/include/kernaux/framebuffer.h) *(planned)*
2022-01-12 10:39:22 +00:00
* USB *(planned)*
2021-12-15 11:03:14 +00:00
* Algorithms
* [Simple command line parser](/include/kernaux/cmdline.h)
* [Example](/examples/cmdline.c)
2022-01-14 05:48:29 +00:00
* [Page Frame Allocator](/include/kernaux/pfa.h) *(work in progress)*
2021-12-15 11:03:14 +00:00
* [Example](/examples/pfa.c)
* Data formats
2022-01-17 07:16:14 +00:00
* [ELF](/include/kernaux/elf.h) *(work in progress)*
* [Master Boot Record](/include/kernaux/mbr.h) *(work in progress)*
2022-01-17 07:15:31 +00:00
* [Multiboot 2 (GRUB 2)](/include/kernaux/multiboot2.h) *(work in progress)*
* Stivale 2 (Limine) *(planned)*
2021-12-15 11:03:14 +00:00
* Utilities
* [Measurement units utils](/include/kernaux/units.h) *(work in progress)*
* [To human](/examples/units_human.c)
* Usual functions
* [libc replacement](/include/kernaux/libc.h)
* [itoa/ftoa replacement](/include/kernaux/ntoa.h) *(work in progress)*
2021-12-15 11:03:14 +00:00
* [printf replacement](/include/kernaux/printf.h) *(work in progress)*
2022-01-19 22:56:58 +00:00
* Code from [https://github.com/mpaland/printf](https://github.com/mpaland/printf). Thank you!
2022-01-19 22:45:50 +00:00
* [printf](/examples/printf.c)
* [vprintf](/examples/printf_va.c)
2022-01-20 10:28:24 +00:00
* [snprintf](/examples/snprintf.c)
* [vsnprintf](/examples/snprintf_va.c)
2020-11-30 01:21:22 +00:00
2021-12-16 08:14:39 +00:00
Tips
----
2020-11-27 13:38:58 +00:00
2021-12-18 01:47:01 +00:00
### 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.
2021-12-20 02:22:43 +00:00
* `--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
2022-01-12 10:52:04 +00:00
undefined behavior in other cases. You can also separately enable or disable
2021-12-20 02:22:43 +00:00
guards:
* `--(enable|disable)-guard-cond`
* `--(enable|disable)-guard-null`
2021-12-18 01:47:01 +00:00
* `--with-libc` - provides the replacement for some standard C functions. Useful
2021-12-19 03:14:30 +00:00
in freestanding environment, where no libc is present. You can also separately
2021-12-20 02:22:43 +00:00
include or exclude components:
2021-12-19 03:16:36 +00:00
* `--with[out]-libc-memset`
* `--with[out]-libc-strcpy`
* `--with[out]-libc-strlen`
2022-01-19 11:14:46 +00:00
* `--with[out]-libc-strnlen`
2021-12-18 01:47:01 +00:00
2022-01-10 16:03:37 +00:00
### Default options
2022-01-20 12:25:58 +00:00
#### Features
2022-01-19 11:40:12 +00:00
* `--enable-float`, disable with `--disable-float`
2022-01-20 12:25:58 +00:00
#### Packages
All packages all included by default. To exclude all packages except those
2022-01-20 12:25:58 +00:00
explicitly included, use `--without-all`.
2022-01-10 16:03:37 +00:00
* `--with[out]-cmdline`
* `--with[out]-console`
* `--with[out]-elf`
2022-01-11 08:58:47 +00:00
* `--with[out]-framebuffer`
* `--with[out]-mbr`
2022-01-10 16:03:37 +00:00
* `--with[out]-multiboot2`
* `--with[out]-ntoa`
* `--with[out]-printf`
2022-01-10 16:03:37 +00:00
* `--with[out]-pfa`
* `--with[out]-units`
2021-12-16 08:14:39 +00:00
### Installation
2021-12-12 16:29:39 +00:00
```
./autogen.sh
./configure
make
sudo make install
```
2021-12-13 22:26:53 +00:00
This is just a usual library. You can use most of it's APIs in hosted
environment.
2021-12-12 16:29:39 +00:00
2021-12-16 08:14:39 +00:00
### Development
```
./autogen.sh
2022-01-17 12:33:28 +00:00
./configure --enable-tests --enable-assert --enable-guard
2021-12-16 08:14:39 +00:00
make
```
You can test with `make check`.
2021-12-15 00:03:40 +00:00
### Cross
2021-12-12 16:29:39 +00:00
2020-11-29 15:49:12 +00:00
Create configuration script with `./autogen.sh`.
2021-12-15 00:10:40 +00:00
Let's assume that your target triplet is `i386-elf`. Configure with
2022-01-12 05:07:53 +00:00
[cross-compiler](https://wiki.osdev.org/GCC_Cross-Compiler) in `$PATH` to make
without it in `$PATH`:
2020-11-27 13:38:58 +00:00
```
./configure \
2021-12-15 00:10:40 +00:00
--host='i386-elf' \
2022-01-11 13:31:48 +00:00
--enable-assert \
--enable-guard \
--with-libc \
2021-12-15 00:10:40 +00:00
AR="$(which i386-elf-ar)" \
CC="$(which i386-elf-gcc)" \
RANLIB="$(which i386-elf-ranlib)" \
2020-12-06 10:16:15 +00:00
CFLAGS='-ffreestanding -nostdlib -fno-builtin -fno-stack-protector'
2020-11-27 13:38:58 +00:00
```
2021-12-12 16:29:39 +00:00
You can see the following messages. It's
2020-12-06 11:41:36 +00:00
[a bug](https://savannah.gnu.org/support/index.php?110393) in **autoconf**, just
ignore it.
2020-12-06 10:27:55 +00:00
```
checking for _Bool... no
2020-12-07 00:11:55 +00:00
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
2021-12-12 12:13:52 +00:00
configure: WARNING: ## ---------------------------------------------------------- ##
configure: WARNING: ## Report this to https://github.com/tailix/libkernaux/issues ##
configure: WARNING: ## ---------------------------------------------------------- ##
2020-12-07 00:11:55 +00:00
checking for stdarg.h... no
2020-12-06 10:27:55 +00:00
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
2021-12-12 12:13:52 +00:00
configure: WARNING: ## ---------------------------------------------------------- ##
configure: WARNING: ## Report this to https://github.com/tailix/libkernaux/issues ##
configure: WARNING: ## ---------------------------------------------------------- ##
2020-12-06 11:22:56 +00:00
checking for stddef.h... no
2020-12-06 10:27:55 +00:00
```
2022-01-17 12:33:28 +00:00
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:
2020-11-27 13:38:58 +00:00
```
src/asm/i386.o: file format elf32-i386
2020-11-27 13:38:58 +00:00
Disassembly of section .text:
2022-01-15 10:42:13 +00:00
00000000 <kernaux_asm_i386_read_cr0>:
0: 0f 20 c0 mov %cr0,%eax
3: c3 ret
2020-11-27 13:38:58 +00:00
2022-01-15 10:42:13 +00:00
00000004 <kernaux_asm_i386_read_cr4>:
4: 0f 20 e0 mov %cr4,%eax
2020-11-27 13:38:58 +00:00
7: c3 ret
2022-01-15 10:42:13 +00:00
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
2020-11-27 13:38:58 +00:00
2022-01-15 10:42:13 +00:00
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
2020-11-27 13:38:58 +00:00
2022-01-15 10:42:13 +00:00
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
2020-11-27 13:38:58 +00:00
```
2020-11-29 16:11:26 +00:00
2022-01-13 06:35:25 +00:00
Architectures
-------------
Architectures should be properly identified. We use the following scheme, but it
may change in future:
* `x86`
* `i386`
* `x86_64`
* `riscv`
* `riscv64`
2021-12-26 06:09:23 +00:00
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
----------
* [Topic on OSDev.org forum](https://forum.osdev.org/viewtopic.php?f=1&t=37958)
* [Thread on r/osdev](https://www.reddit.com/r/osdev/comments/k3ueeu/libkernaux_auxiliary_library_for_kernel/)