TCC-anothertry begins
This commit is contained in:
parent
946c9e468d
commit
12e7efb8b5
6 changed files with 87 additions and 84 deletions
16
Makefile
16
Makefile
|
@ -1,23 +1,21 @@
|
|||
all: build/kernel-i386.elf
|
||||
clean:
|
||||
-@rm build/*.o build/*.elf 2> /dev/null || true
|
||||
-@rm build/* 2> /dev/null || true
|
||||
|
||||
build/start32.o: build/ src/start32.asm
|
||||
nasm -felf32 src/start32.asm -o build/start32.o
|
||||
build/kernel-i386.elf: build/start32.o
|
||||
tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/*.c build/start32.o
|
||||
build/kernel-i386.elf: src/*
|
||||
tcc -m32 -nostdlib -Wl,-Ttext,0x100000 -o build/kernel-i386.elf src/start32.s src/*.c
|
||||
image: build/kernel-i386.elf mount
|
||||
cp build/kernel-i386.elf mnt/
|
||||
cp build/kernel-i386.elf mnt/roska/start32.elf
|
||||
sync
|
||||
|
||||
qemu-multiboot: build/kernel-i386.elf
|
||||
qemu-system-i386 -kernel build/kernel-i386.elf -serial stdio
|
||||
qemu-image: image
|
||||
qemu-system-i386 koalemos.img -serial stdio
|
||||
qemu-system-i386 roska.img -serial stdio
|
||||
|
||||
mount: koalemos.img mnt/
|
||||
mount: roska.img mnt/
|
||||
@if ! mountpoint -q "mnt/"; then \
|
||||
sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) koalemos.img mnt/; \
|
||||
sudo mount -o loop,offset=1048576,umask=177,dmask=022,uid=$(shell id -u),gid=$(shell id -g) roska.img mnt/; \
|
||||
fi;
|
||||
umount:
|
||||
@sudo umount mnt
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
# KoalemOS
|
||||
# rOSka
|
||||
Multiboot compatible stupid useless OS-like project.
|
||||
## Compatibility
|
||||
32bit x86 legacy BIOS system
|
||||
- x86 system with MultiBoot compatible bootloader.
|
||||
- Linear framebuffer graphics
|
||||
## Building
|
||||
NASM and TinyCCompiler are used.
|
||||
TinyCCompiler is used, even for assembly lol.
|
||||
TCC might need manual compilation for 32bit crosscompilation
|
||||
on 64bit systems.
|
||||
Just download the source and `make cross` or something.
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
#include "multiboot.h"
|
||||
#include "framebuffer.h"
|
||||
#include "serial.h"
|
||||
|
@ -19,7 +20,7 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
|
|||
outb(0x3D5, 0x20);
|
||||
|
||||
int serial_initialized = serial_init();
|
||||
serial_write_string("\n=== KoalemOS ===\n");
|
||||
serial_write_string("\n=== rOSka ===\n");
|
||||
|
||||
// Check multiboot header
|
||||
if (mbootmagick != MULTIBOOT_BOOTLOADER_MAGIC) {
|
||||
|
@ -73,11 +74,11 @@ void kmain (unsigned int mbootmagick, multiboot_info_t* mbootinfo) {
|
|||
for(;;) {
|
||||
for(y=0; y < mbootinfo->framebuffer_height; y++) {
|
||||
for(x=0; x < mbootinfo->framebuffer_width; x++) {
|
||||
putpixel(x, y, c, c, c, 0xff);
|
||||
putpixel(x, y, 0, c, c, 0xff);
|
||||
}
|
||||
}
|
||||
c+=4;
|
||||
}
|
||||
|
||||
serial_write_string("\nExecution finished, halting...");
|
||||
serial_write_string("\nExecution finished, halting...\n");
|
||||
}
|
||||
|
|
45
src/serial.c
45
src/serial.c
|
@ -20,30 +20,31 @@ int serial_init() {
|
|||
outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
|
||||
outb(PORT + 4, 0x1E); // Set in loopback mode, test the serial chip
|
||||
outb(PORT + 0, 0xAE); // Test serial chip (send byte 0xAE and check if serial
|
||||
// returns same byte)
|
||||
// returns same byte)
|
||||
|
||||
// Check if serial is faulty (i.e: not same byte as sent)
|
||||
if (inb(PORT + 0) != 0xAE) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// If serial is not faulty set it in normal operation mode
|
||||
// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
|
||||
outb(PORT + 4, 0x0F);
|
||||
return 0;
|
||||
}
|
||||
static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; }
|
||||
|
||||
static void serial_write_char(char chr) {
|
||||
while (serial_is_transmit_empty() == 0);
|
||||
outb(PORT, chr);
|
||||
// Check if serial is faulty (i.e: not same byte as sent)
|
||||
if (inb(PORT + 0) != 0xAE) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void serial_write_string(const char* text) {
|
||||
int i = 0;
|
||||
while(text[i]) {
|
||||
serial_write_char(text[i]);
|
||||
i++;
|
||||
}
|
||||
// If serial is not faulty set it in normal operation mode
|
||||
// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
|
||||
outb(PORT + 4, 0x0F);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int serial_is_transmit_empty() { return inb(PORT + 5) & 0x20; }
|
||||
|
||||
static void serial_write_char(char chr) {
|
||||
while (serial_is_transmit_empty() == 0);
|
||||
outb(PORT, chr);
|
||||
}
|
||||
|
||||
void serial_write_string(const char* text) {
|
||||
int i = 0;
|
||||
while(text[i]) {
|
||||
serial_write_char(text[i]);
|
||||
i++;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
|
||||
MULTIBOOT_PAGE_ALIGN equ 1 << 0
|
||||
MULTIBOOT_MEMORY_INFO equ 1 << 1
|
||||
MULTIBOOT_VIDEO_REQUEST equ 0 << 2
|
||||
MULTIBOOT_AOUT_KLUDGE equ 0 << 16
|
||||
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST
|
||||
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_REQUEST | MULTIBOOT_AOUT_KLUDGE
|
||||
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
|
||||
|
||||
section .multiboot
|
||||
align 4
|
||||
dd MULTIBOOT_HEADER_MAGIC
|
||||
dd MULTIBOOT_HEADER_FLAGS
|
||||
dd MULTIBOOT_CHECKSUM
|
||||
dd 0 ; header address
|
||||
dd 0 ; load address
|
||||
dd 0 ; load end address
|
||||
dd 0 ; bss end address
|
||||
dd 0 ; entry address
|
||||
dd 0 ; video mode_type (0:fb, 1:txt) (set flags[2]!)
|
||||
dd 1024 ; video width
|
||||
dd 768 ; video height
|
||||
dd 32 ; video depth
|
||||
|
||||
section .bss
|
||||
align 16
|
||||
stack_bottom:
|
||||
resb 16384
|
||||
stack_top:
|
||||
|
||||
section .text
|
||||
global _start
|
||||
extern kmain
|
||||
|
||||
_start:
|
||||
; Setup stack
|
||||
mov esp, stack_top
|
||||
|
||||
; Call the main kernel function.
|
||||
push ebx
|
||||
push eax
|
||||
call kmain
|
||||
|
||||
.hang:
|
||||
cli
|
||||
hlt
|
||||
jmp .hang
|
49
src/start32.s
Normal file
49
src/start32.s
Normal file
|
@ -0,0 +1,49 @@
|
|||
.set MULTIBOOT_PAGE_ALIGN, 1 << 0
|
||||
.set MULTIBOOT_MEMORY_INFO, 1 << 1
|
||||
.set MULTIBOOT_VIDEO_REQUEST, 1 << 2
|
||||
.set MULTIBOOT_AOUT_KLUDGE, 0 << 16
|
||||
.set MULTIBOOT_HEADER_MAGIC, 0x1BADB002
|
||||
.set MULTIBOOT_HEADER_FLAGS, \
|
||||
MULTIBOOT_PAGE_ALIGN |\
|
||||
MULTIBOOT_MEMORY_INFO |\
|
||||
MULTIBOOT_VIDEO_REQUEST |\
|
||||
MULTIBOOT_AOUT_KLUDGE
|
||||
.set MULTIBOOT_CHECKSUM, -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
|
||||
|
||||
#.section ".multiboottbabeee"
|
||||
.align 4
|
||||
.long MULTIBOOT_HEADER_MAGIC
|
||||
.long MULTIBOOT_HEADER_FLAGS
|
||||
.long MULTIBOOT_CHECKSUM
|
||||
.long 0 # header address
|
||||
.long 0 # load address
|
||||
.long 0 # load end address
|
||||
.long 0 # bss end address
|
||||
.long 0 # entry address
|
||||
.long 0 # video mode_type (0:fb, 1:txt) (set flags[2]!)
|
||||
.long 1024 # video width
|
||||
.long 768 # video height
|
||||
.long 32 # video depth
|
||||
|
||||
.bss
|
||||
.align 16
|
||||
stack_bottom:
|
||||
.skip 16384 # 16k
|
||||
stack_top:
|
||||
|
||||
.text
|
||||
.global _start
|
||||
_start:
|
||||
# Setup stack
|
||||
mov $stack_top, %esp
|
||||
|
||||
# Call the main kernel function.
|
||||
push %ebx
|
||||
push %eax
|
||||
call kmain
|
||||
|
||||
|
||||
cli
|
||||
1: hlt
|
||||
jmp 1b
|
||||
#include "lol.s"
|
Loading…
Reference in a new issue