618
edits
[unchecked revision] | [unchecked revision] |
m (mention the Stan Dard style) |
No edit summary |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 1:
{{FirstPerson}}
{{You}}
{{BeginnersWarning}}
{{Rating|1
{{Kernel designs}}
operating system in the [[Stan Dard]] style suitable for further modification or
as inspiration for your initial operating system version. The [[Bare Bones]]
Line 51 ⟶ 53:
== Building a Cross-Compiler ==
You ''must'' use a [[GCC Cross-Compiler]] in this tutorial as in the
Line 131 ⟶ 133:
mandatory options the project makefile requires:
<
# Default CFLAGS:
CFLAGS?=-O2 -g
Line 137 ⟶ 139:
# Add mandatory options to CFLAGS:
CFLAGS:=$(CFLAGS) -Wall -Wextra
</syntaxhighlight>
== Architecture Directories ==
Line 223 ⟶ 225:
You can easily download the source code using [[Git]] from the [https://gitlab.com/sortie/meaty-skeleton Meaty Skeleton Git repository]. This is preferable to doing a manual error-prone copy, as you may make a mistake or whitespace may get garbled due to bugs in our syntax highlighting. To clone the git repository, do:
<
git clone https://gitlab.com/sortie/meaty-skeleton.git
</syntaxhighlight>
Check for differences between the git revision used in this article and what you cloned (empty output means there is no difference):
<
git diff 084d1624bedaa9f9e395f055c6bd99299bd97f58..master
</syntaxhighlight>
Operating systems development is about being an expert. Take the time to read the code carefully through and understand it. Please seek further information and help if you don't understand aspects of it. This code is minimal and almost everything is done deliberately, often to pre-emptively solve future problems.
Line 238 ⟶ 240:
==== kernel/include/kernel/tty.h ====
<
#ifndef _KERNEL_TTY_H
#define _KERNEL_TTY_H
Line 250 ⟶ 252:
#endif
</syntaxhighlight>
==== kernel/Makefile ====
<
DEFAULT_HOST!=../default-host.sh
HOST?=DEFAULT_HOST
Line 338 ⟶ 340:
-include $(OBJS:.o=.d)
</syntaxhighlight>
==== kernel/kernel/kernel.c ====
<
#include <stdio.h>
Line 351 ⟶ 353:
printf("Hello, kernel World!\n");
}
</syntaxhighlight>
==== kernel/arch/i386/tty.c ====
<
#include <stdbool.h>
#include <stddef.h>
Line 442 ⟶ 444:
terminal_write(data, strlen(data));
}
</syntaxhighlight>
==== kernel/arch/i386/crtn.S ====
Line 460 ⟶ 462:
==== kernel/arch/i386/vga.h ====
<
#ifndef ARCH_I386_VGA_H
#define ARCH_I386_VGA_H
Line 494 ⟶ 496:
#endif
</syntaxhighlight>
==== kernel/arch/i386/make.config ====
<
KERNEL_ARCH_CFLAGS=
KERNEL_ARCH_CPPFLAGS=
Line 507 ⟶ 509:
$(ARCHDIR)/boot.o \
$(ARCHDIR)/tty.o \
</syntaxhighlight>
==== kernel/arch/i386/crti.S ====
Line 633 ⟶ 635:
==== libc/include/string.h ====
<
#ifndef _STRING_H
#define _STRING_H 1
Line 656 ⟶ 658:
#endif
</syntaxhighlight>
==== libc/include/stdio.h ====
<
#ifndef _STDIO_H
#define _STDIO_H 1
Line 681 ⟶ 683:
#endif
</syntaxhighlight>
==== libc/include/sys/cdefs.h ====
<
#ifndef _SYS_CDEFS_H
#define _SYS_CDEFS_H 1
Line 692 ⟶ 694:
#endif
</syntaxhighlight>
==== libc/include/stdlib.h ====
<
#ifndef _STDLIB_H
#define _STDLIB_H 1
Line 714 ⟶ 716:
#endif
</syntaxhighlight>
==== libc/Makefile ====
<
DEFAULT_HOST!=../default-host.sh
HOST?=DEFAULT_HOST
Line 812 ⟶ 814:
-include $(OBJS:.o=.d)
-include $(LIBK_OBJS:.o=.d)
</syntaxhighlight>
==== libc/stdlib/abort.c ====
<
#include <stdio.h>
#include <stdlib.h>
Line 833 ⟶ 835:
__builtin_unreachable();
}
</syntaxhighlight>
==== libc/string/memmove.c ====
<
#include <string.h>
Line 852 ⟶ 854:
return dstptr;
}
</syntaxhighlight>
==== libc/string/strlen.c ====
<
#include <string.h>
Line 865 ⟶ 867:
return len;
}
</syntaxhighlight>
==== libc/string/memcmp.c ====
<
#include <string.h>
Line 883 ⟶ 885:
return 0;
}
</syntaxhighlight>
==== libc/string/memset.c ====
<
#include <string.h>
Line 896 ⟶ 898:
return bufptr;
}
</syntaxhighlight>
==== libc/string/memcpy.c ====
<
#include <string.h>
Line 910 ⟶ 912:
return dstptr;
}
</syntaxhighlight>
==== libc/stdio/puts.c ====
<
#include <stdio.h>
Line 920 ⟶ 922:
return printf("%s\n", string);
}
</syntaxhighlight>
==== libc/stdio/putchar.c ====
<
#include <stdio.h>
Line 940 ⟶ 942:
return ic;
}
</syntaxhighlight>
==== libc/stdio/printf.c ====
<
#include <limits.h>
#include <stdbool.h>
Line 1,025 ⟶ 1,027:
return written;
}
</syntaxhighlight>
==== libc/arch/i386/make.config ====
<
ARCH_CFLAGS=
ARCH_CPPFLAGS=
Line 1,038 ⟶ 1,040:
ARCH_HOSTEDOBJS=\
</syntaxhighlight>
==== libc/.gitignore ====
Line 1,054 ⟶ 1,056:
==== build.sh ====
<
#!/bin/sh
set -e
Line 1,062 ⟶ 1,064:
(cd $PROJECT && DESTDIR="$SYSROOT" $MAKE install)
done
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x build.sh
</syntaxhighlight>
==== clean.sh ====
<
#!/bin/sh
set -e
Line 1,083 ⟶ 1,085:
rm -rf isodir
rm -rf myos.iso
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x clean.sh
</syntaxhighlight>
==== config.sh ====
<
SYSTEM_HEADER_PROJECTS="libc kernel"
PROJECTS="libc kernel"
Line 1,121 ⟶ 1,123:
export CC="$CC -isystem=$INCLUDEDIR"
fi
</syntaxhighlight>
==== default-host.sh ====
<
#!/bin/sh
echo i686-elf
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x default-host.sh
</syntaxhighlight>
==== headers.sh ====
<
#!/bin/sh
set -e
Line 1,147 ⟶ 1,149:
(cd $PROJECT && DESTDIR="$SYSROOT" $MAKE install-headers)
done
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x headers.sh
</syntaxhighlight>
==== iso.sh ====
<
#!/bin/sh
set -e
Line 1,172 ⟶ 1,174:
EOF
grub-mkrescue -o myos.iso isodir
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x iso.sh
</syntaxhighlight>
==== qemu.sh ====
<
#!/bin/sh
set -e
Line 1,187 ⟶ 1,189:
qemu-system-$(./target-triplet-to-arch.sh $HOST) -cdrom myos.iso
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x qemu.sh
</syntaxhighlight>
==== target-triplet-to-arch.sh ====
<
#!/bin/sh
if echo "$1" | grep -Eq 'i[[:digit:]]86-'; then
Line 1,203 ⟶ 1,205:
echo "$1" | grep -Eo '^[[:alnum:]_]*'
fi
</syntaxhighlight>
You should make this executable script executable by running:
<
chmod +x target-triplet-to-arch.sh
</syntaxhighlight>
==== .gitignore ====
Line 1,227 ⟶ 1,229:
the source tree by invoking:
<
./clean.sh
</syntaxhighlight>
You can install all the system headers into the system root without relying on
Line 1,235 ⟶ 1,237:
[[Hosted GCC Cross-Compiler]], by invoking:
<
./headers.sh
</syntaxhighlight>
You can build a bootable cdrom image of the operating system by invoking:
<
./iso.sh
</syntaxhighlight>
It's probably a good idea to create a quick ''build-and-then-launch'' short-cut
like used in this example to run the system in your favorite emulator quickly:
<
./qemu.sh
</syntaxhighlight>
== Troubleshooting ==
Line 1,295 ⟶ 1,297:
* [[topic:36584|A link error found & fixed]]
[[Category:
[[Category:C]]
|