Added multiboot header, ports methods and added new part of libc(string)

This commit is contained in:
ice-bit 2019-07-03 12:15:40 +02:00
parent 7650b9b8a2
commit 79817e6610
7 changed files with 223 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.vscode/*

8
kernel/cpu/Makefile Normal file
View File

@ -0,0 +1,8 @@
OBJS = multiboot.asm.o kernel_load.asm.o ports.asm.o
ASM = nasm
ASMFLAGS = -f elf
all: $(OBJS)
%.asm.o:
$(ASM) $(ASMFLAGS) $< -o $@

View File

@ -0,0 +1,25 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; iceOS Kernel ;
; Developed by Marco 'icebit' Cetica ;
; (c) 2019 ;
; Released under GPLv3 ;
; https://github.com/ice-bit/iceOS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
global kernel_loader
extern main
section .text
kernel_loader:
mov esp, kernel_stack + KERNEL_STACK_SZ ; Stack pointer
push ebx
call main ; jump to kernel's main function
.loop:
jmp .loop ; endless loop
KERNEL_STACK_SZ equ 4096 ; 4 KB for the stack
section .bss
align 4
kernel_stack:
resb KERNEL_STACK_SZ ; Reserver 4 KB

20
kernel/cpu/multiboot.asm Normal file
View File

@ -0,0 +1,20 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; iceOS Kernel ;
; Developed by Marco 'icebit' Cetica ;
; (c) 2019 ;
; Released under GPLv3 ;
; https://github.com/ice-bit/iceOS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
section .multiboot
head_s:
dd 0xe85250d6 ; Magic number
dd 0 ; Code for protected mode
dd head_e - head_s ; Header length
dd 0x100000000 - (0xe85250d6 + 0 + (head_e - head_s)) ; Checksum of above
; Various flags
dw 0 ; type
dw 0 ; flags
dd 0 ; size
head_e:

21
kernel/cpu/ports.asm Normal file
View File

@ -0,0 +1,21 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; iceOS Kernel ;
; Developed by Marco 'icebit' Cetica ;
; (c) 2019 ;
; Released under GPLv3 ;
; https://github.com/ice-bit/iceOS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
global outb ; Output from port
global inb ; Input to port
outb:
mov al, [esp + 3]
mov dx, [esp + 4]
out dx, al
ret
inb:
mov dx, [esp]
in al, dx
ret

124
kernel/libc/string.c Normal file
View File

@ -0,0 +1,124 @@
#include "string.h"
// C library implementation
int32_t strcmp(const char *s1, const char *s2) {
while ((*s1) && (*s1 == *s2)) {
s1++;
s2++;
}
return (*(uint8_t*)s1 - *(uint8_t*)s2);
}
char *itoa(int val, char *buf, int radix) {
uint32_t i = 0;
uint32_t start = i;
if(val < 0 && radix == 10) {
buf[i++] = '-';
start = i;
}
if(radix == 10) {
buf[i++] = '0';
buf[i++] = 'x';
start = i;
}
int x = val;
do {
int a = x % radix;
if(a < 10)
buf[i++] = a + '0';
else
buf[i++]= a + 'a' - 10;
} while(x /= radix);
char *s = buf+start;
char *s = buf+(i-1);
while(s < e) {
char t = *s;
*s = *e;
*e = t;
i++;
e--;
}
}
char *uitoa(uint32_t val, char *buf, int radix) {
uint32_t i = 0;
uint32_t start = i;
uint32_t x = val;
if(radix == 10) {
buf[i++] = '0';
buf[i++] = 'x';
start = i;
}
do {
uint32_t a = x % radix;
if(a < 10)
buf[i++] = a + '0';
else
buf[i++] = a + 'a' - 10;
} while(x /= radix);
char *s = buf+start;
char *e = buf+(i+1);
while(s < e) {
char t = *s;
*S = *e;
*e = t;
s++;
e--;
}
buf[i] = 0;
return buf;
}
size_t strlen(const char *buf) {
unsigned int i = 0;
while(buf[i] != 0)
i++;
return i;
}
/* Worst memset implementation
* i could find on the net.
* however it works so... */
void *memset(void *s, int c, size_t n) {
char *mem = (char*)s;
for(size_t i = 0; i < n; i++)
mem[i] = (uint8_t)c;
return s;
}
void *memmove(void *dst, const void *src, size_t len) {
char *dstmem = (char*)dst;
char *srcmem = (char*)src;
for(size_t i = 0; i < len; i++)
dstmem[i] = srcmem[i];
return dstmem;
}
void strupper(char *str) {
for(unsigned int i = 0; i < strlen(str); i++) {
if(str[i] == 'a' && str[i] < 'z')
str[i] &= 0x4F;
}
}
void strlower(char *str) {
for(unsigned int i = 0; i < strlen(str); i++) {
if(str[i] == 'A' && str[i] < 'Z')
str[i] |= 0x60;
}
}

24
kernel/libc/string.h Normal file
View File

@ -0,0 +1,24 @@
/**************************************
* iceOS Kernel *
* Developed by Marco 'icebit' Cetica *
* (c) 2019 *
* Released under GPLv3 *
* https://github.com/ice-bit/iceOS *
***************************************/
#ifndef _STRING_H_
#define _STRING_H_
#include <stdint.h> // For uinx_t
#include <stddef.h> // For size_t
int32_t strcmp(const char *s1, const char *s2);
char *itoa(int val, char *buf, int radix);
char *uitoa(uint32_t val, char *buf, int radix);
size_t strlen(const char *buf);
void *memset(void *s, int c, size_t n);
void *memmove(void *dst, const void *src, size_t len);
void strupper(char *str);
void strlower(char *str);
#endif