diff --git a/exp/MyOS/Boot/grub/menu.cfg b/exp/MyOS/Boot/grub/menu.cfg new file mode 100644 index 0000000..d089a51 --- /dev/null +++ b/exp/MyOS/Boot/grub/menu.cfg @@ -0,0 +1,9 @@ +default 0 +timeout 0 +hiddenmenu + +title MyOS +root (fd0) +kernel /kernel.bin +boot + diff --git a/exp/MyOS/build.sh b/exp/MyOS/build.sh new file mode 100644 index 0000000..52a90d7 --- /dev/null +++ b/exp/MyOS/build.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +build=build +compiler=i586-elf-gcc +linker=i586-elf-ld +opt="-Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I./kernel/include -c -fno-strict-aliasing -fno-common -fno-stack-protector" + +echo "Building..." +echo "===========" + +# Build C files + +$compiler $opt -o $build/main.o ./kernel/main.c +$compiler $opt -o $build/console.o ./kernel/console.c + +# Build ASM files +nasm -f elf ./kernel/loader.asm -o $build/loader.o + +# Link +$linker -T linker.ld $build/*.o + +# Put on floppy image +mount A: /mnt/floppy +cp kernel.bin /mnt/floppy/ diff --git a/exp/MyOS/kernel/console.c b/exp/MyOS/kernel/console.c new file mode 100644 index 0000000..6184f22 --- /dev/null +++ b/exp/MyOS/kernel/console.c @@ -0,0 +1,110 @@ +#include +#include + +UPoint ConsoleCursor = {0, 0}; +UPoint ConsoleSize = {ConsoleWidth, ConsoleHeight}; + +uint8* VideoRam = (uint8*)0xb8000; + +void ConsoleClear() +{ + uint32 i; + for (i = 0; i < ConsoleSize.X * ConsoleSize.Y * 2; i++) + VideoRam[i] = 0; +} + +void ConsoleScroll() +{ + uint32 i; + + for (i = 0; i < ConsoleSize.X * (ConsoleSize.Y-1) * 2; i++) + VideoRam[i] = VideoRam[i + (ConsoleSize.X * 2)]; + + for (i = ConsoleSize.X * (ConsoleSize.Y-1) * 2; i < ConsoleSize.X * ConsoleSize.Y * 2; i++) + VideoRam[i] = 0; + + ConsoleCursor.Y--; +} + +void ConsoleWriteChar(char c) +{ + ConsoleWriteCharColored(c, ConsoleDefaultColor); +} + +void ConsoleWriteCharColored (char c, uint8 color) +{ + uint32 location = ConsoleCursor.X + ConsoleCursor.Y * ConsoleSize.X; + + switch (c) + { + case '\n': ConsoleCursor.X = 0; ConsoleCursor.Y ++; break; + case '\r': ConsoleCursor.X = 0; break; + case '\t': while (++ConsoleCursor.X % 6 != 0); break; + + default: + + VideoRam[2*location] = c; + VideoRam[2*location + 1] = color; + + ConsoleCursor.X++; + break; + } + + if (ConsoleCursor.X >= ConsoleSize.X) { + ConsoleCursor.X = 0; + ConsoleCursor.Y ++; + } + + if (ConsoleCursor.Y >= ConsoleSize.Y) ConsoleScroll(); +} + +void ConsoleWriteString (string s) +{ + ConsoleWriteStringColored (s, ConsoleDefaultColor); +} + +void ConsoleWriteStringColored (string s, uint8 color) +{ + while (*s != 0) + { + ConsoleWriteCharColored (*s, color); + s = s + 1; + } +} + +void ConsoleWrite (string format, ...) +{ + if (!format || (*format) == 0) return; + + va_list args; + va_start (args, format); + uint8 color = ConsoleDefaultColor; + + for (; *format != 0; format = format+1) + if (*format != '%') ConsoleWriteCharColored (*format, color); + else { + format = format+1; + switch (*format) + { + case 'S': + case 's': + { + string s = (string) va_arg(args, string); + ConsoleWriteStringColored (s, color); + break; + } + + case 'C': + case 'c': + { + char c = (char) va_arg(args, char); + ConsoleWriteCharColored (c, color); + break; + } + + case '#': color = (uint8) va_arg(args, uint8); break; + + + } + } +} \ No newline at end of file diff --git a/exp/MyOS/kernel/include/console.h b/exp/MyOS/kernel/include/console.h new file mode 100644 index 0000000..13d0d24 --- /dev/null +++ b/exp/MyOS/kernel/include/console.h @@ -0,0 +1,39 @@ +#ifndef __CONSOLE_H__ +#define __CONSOLE_H__ + +#include +#include + +#define ConsoleWidth 80 +#define ConsoleHeight 25 +#define ConsoleDefaultColor 0x7 + +enum Colors { + ColorBlack = 0x0, + ColorBlue = 0x1, + ColorGreen = 0x2, + ColorCyan = 0x3, + ColorRed = 0x4, + ColorMagenta = 0x5, + ColorBrown = 0x6, + ColorLightGray = 0x7, + ColorDarkGray = 0x8, + ColorLightBlue = 0x9, + ColorLightGreen = 0xA, + ColorLightCyan = 0xB, + ColorLightRed = 0xC, + ColorLightMagenta = 0xD, + ColorYellow = 0xE, + ColorWhite = 0xF +}; + +extern void ConsoleClear(); +extern void ConsoleWriteChar(char c); +extern void ConsoleWriteCharColored (char c, uint8 color); +extern void ConsoleWriteString (string s); +extern void ConsoleWriteStringColored (string s, uint8 color); +extern void ConsoleScroll(); + +extern void ConsoleWrite (string format, ...); + +#endif \ No newline at end of file diff --git a/exp/MyOS/kernel/include/stdarg.h b/exp/MyOS/kernel/include/stdarg.h new file mode 100644 index 0000000..80095e5 --- /dev/null +++ b/exp/MyOS/kernel/include/stdarg.h @@ -0,0 +1,27 @@ +#ifndef __STDARG__H +#define __STDARG__H + +#include + +/* width of stack == width of int */ +#define STACKITEM int + +/* round up width of objects pushed on stack. The expression before the +& ensures that we get 0 for objects of size 0. */ +#define VA_SIZE(TYPE) \ + ((sizeof(TYPE) + sizeof(STACKITEM) - 1) \ + & ~(sizeof(STACKITEM) - 1)) + +/* &(LASTARG) points to the LEFTMOST argument of the function call +(before the ...) */ +#define va_start(AP, LASTARG) \ + (AP=((va_list)&(LASTARG) + VA_SIZE(LASTARG))) + +/* nothing for va_end */ +#define va_end(AP) + +#define va_arg(AP, TYPE) \ + (AP += VA_SIZE(TYPE), *((TYPE *)(AP - VA_SIZE(TYPE)))) + + +#endif diff --git a/exp/MyOS/kernel/include/types.h b/exp/MyOS/kernel/include/types.h new file mode 100644 index 0000000..d1c6761 --- /dev/null +++ b/exp/MyOS/kernel/include/types.h @@ -0,0 +1,26 @@ +#ifndef __TYPES_H__ +#define __TYPES_H__ + +typedef signed char int8; +typedef unsigned char uint8; + +typedef signed short int16; +typedef unsigned short uint16; + +typedef signed int int32; +typedef unsigned int uint32; + +typedef signed long long int64; +typedef unsigned long long uint64; + +typedef char* string; + +typedef struct { + int32 X, Y; +} Point; + +typedef struct { + uint32 X, Y; +} UPoint; + +#endif \ No newline at end of file diff --git a/exp/MyOS/kernel/include/va_list.h b/exp/MyOS/kernel/include/va_list.h new file mode 100644 index 0000000..cba2f2f --- /dev/null +++ b/exp/MyOS/kernel/include/va_list.h @@ -0,0 +1,7 @@ +#ifndef __VA_LIST_H__ +#define __VA_LIST_H__ + +/* va list parameter list */ +typedef unsigned char *va_list; + +#endif \ No newline at end of file diff --git a/exp/MyOS/kernel/loader.asm b/exp/MyOS/kernel/loader.asm new file mode 100644 index 0000000..5a2a32d --- /dev/null +++ b/exp/MyOS/kernel/loader.asm @@ -0,0 +1,41 @@ +bits 32 + +global loader +extern kmain + +; Multiboot header +MODULEALIGN equ 1<<0 +MEMINFO equ 1<<1 +FLAGS equ MODULEALIGN | MEMINFO +MAGIC equ 0x1BADB002 +CHECKSUM equ -(MAGIC + FLAGS) + +MultibootHeader: + dd MAGIC + dd FLAGS + dd CHECKSUM + +STACKSIZE equ 0x4000 ; 16 KB + +loader: + cmp eax, 0x2BADB002 ; verify booted with grub + jne .bad + + mov esp, STACKSIZE + stack + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + + push ebx + call kmain + +.bad: + cli + hlt + +align 4 +stack: + TIMES STACKSIZE db 0 + diff --git a/exp/MyOS/kernel/main.c b/exp/MyOS/kernel/main.c new file mode 100644 index 0000000..d209fe3 --- /dev/null +++ b/exp/MyOS/kernel/main.c @@ -0,0 +1,8 @@ +#include + +void kmain (void* MultibootStructure) +{ + ConsoleClear(); + ConsoleWrite("Hello world :D %# Hello world\n", ColorLightCyan); + ConsoleWrite("Character: '%c' String: '%s'\n", 'p', "Hi there"); +} diff --git a/exp/MyOS/linker.ld b/exp/MyOS/linker.ld new file mode 100644 index 0000000..948dae7 --- /dev/null +++ b/exp/MyOS/linker.ld @@ -0,0 +1,28 @@ +ENTRY (loader) +OUTPUT ("kernel.bin") + +addr = 0x100000; + +SECTIONS +{ + .text addr : + ALIGN(0x1000) + { + *(.text*); + *(.rodata*); + } + + .data : + ALIGN(0x1000) + { + *(.data*); + } + + .bss : + ALIGN(0x1000) + { + *(.bss*); + } + +} + diff --git a/exp/MyOS/tar-2011-04/build.sh b/exp/MyOS/tar-2011-04/build.sh new file mode 100755 index 0000000..6777e38 --- /dev/null +++ b/exp/MyOS/tar-2011-04/build.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +build=build + +clear +echo "Building..." +echo "===========" + +# Build C files +echo "[ 5%] main.c" + +gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I./kernel/include -c -o $build/main.o ./kernel/main.c -fno-strict-aliasing -fno-common -fno-stack-protector + +# Build ASM files +echo "[50%] loader.asm" +nasm -f elf ./kernel/loader.asm -o $build/loader.o + +# Link +echo "[90%] Linking..." +ld -T linker.ld $build/*.o + +# Put on floppy image +echo "[99%] Writing to floppy image..." +cp Boot/myos.img myos.img +mkdir /media/floppy1 +mount -o loop myos.img /media/floppy1 +cp kernel.bin /media/floppy1/ +umount /media/floppy1 +rm -r /media/floppy1 + +# DONE +echo "[100] DONE!" + diff --git a/exp/MyOS/tar-2011-04/kernel/main.c b/exp/MyOS/tar-2011-04/kernel/main.c new file mode 100755 index 0000000..cb422d9 --- /dev/null +++ b/exp/MyOS/tar-2011-04/kernel/main.c @@ -0,0 +1,4 @@ +void kmain (void* MultibootStructure) +{ + +} diff --git a/exp/README.md b/exp/README.md index 8bac9ae..a55d068 100644 --- a/exp/README.md +++ b/exp/README.md @@ -54,3 +54,10 @@ into the kernel (2011). `conio.h` reference), 2010. The files with a `.HT~` extension are 8.3-mangled names (probably `.html~` backups); the CKEditor copy that came with them is not included. The Nov 2010 - Mar 2011 NetBeans project shell is in `ctaos/` above. + +- `MyOS/` (Apr-Aug 2011): small GRUB/multiboot test kernel written while + learning to set up an i586-elf cross toolchain, shortly before the luxOS + kernel proper: NASM multiboot loader, `kmain`, a VGA text console with + printf-style `ConsoleWrite`, `build.sh`, linker script and a GRUB `menu.cfg`. + `tar-2011-04/` holds the older April versions of `main.c` and `build.sh` found + in `MyOS.tar`. Disk images (`myos.img`), GRUB stages and `kernel.bin` are not included.