add firsts files
This commit is contained in:
commit
306cbbf842
10 changed files with 291 additions and 0 deletions
79
.gitignore
vendored
Normal file
79
.gitignore
vendored
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# Created by https://www.toptal.com/developers/gitignore/api/c,vim
|
||||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=c,vim
|
||||||
|
|
||||||
|
### C ###
|
||||||
|
# Prerequisites
|
||||||
|
*.d
|
||||||
|
|
||||||
|
# Object files
|
||||||
|
*.o
|
||||||
|
*.ko
|
||||||
|
*.obj
|
||||||
|
*.elf
|
||||||
|
|
||||||
|
# Linker output
|
||||||
|
*.ilk
|
||||||
|
*.map
|
||||||
|
*.exp
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Libraries
|
||||||
|
*.lib
|
||||||
|
*.a
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
|
||||||
|
# Shared objects (inc. Windows DLLs)
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.i*86
|
||||||
|
*.x86_64
|
||||||
|
*.hex
|
||||||
|
|
||||||
|
# Debug files
|
||||||
|
*.dSYM/
|
||||||
|
*.su
|
||||||
|
*.idb
|
||||||
|
*.pdb
|
||||||
|
|
||||||
|
# Kernel Module Compile Results
|
||||||
|
*.mod*
|
||||||
|
*.cmd
|
||||||
|
.tmp_versions/
|
||||||
|
modules.order
|
||||||
|
Module.symvers
|
||||||
|
Mkfile.old
|
||||||
|
dkms.conf
|
||||||
|
|
||||||
|
### Vim ###
|
||||||
|
# Swap
|
||||||
|
[._]*.s[a-v][a-z]
|
||||||
|
!*.svg # comment out if you don't need vector files
|
||||||
|
[._]*.sw[a-p]
|
||||||
|
[._]s[a-rt-v][a-z]
|
||||||
|
[._]ss[a-gi-z]
|
||||||
|
[._]sw[a-p]
|
||||||
|
|
||||||
|
# Session
|
||||||
|
Session.vim
|
||||||
|
Sessionx.vim
|
||||||
|
|
||||||
|
# Temporary
|
||||||
|
.netrwhist
|
||||||
|
*~
|
||||||
|
# Auto-generated tag files
|
||||||
|
tags
|
||||||
|
# Persistent undo
|
||||||
|
[._]*.un~
|
||||||
|
|
||||||
|
# End of https://www.toptal.com/developers/gitignore/api/c,vim
|
40
Makefile
Normal file
40
Makefile
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
OBJECTS = loader.o framebuffer.o io.o kmain.o
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector \
|
||||||
|
-nostartfiles -nodefaultlibs -c #-Wall -Wextra -Werror -c
|
||||||
|
|
||||||
|
LDFLAGS = -T link.ld -melf_i386
|
||||||
|
|
||||||
|
AS = nasm
|
||||||
|
ASFLAGS = -f elf
|
||||||
|
|
||||||
|
all: kernel.elf
|
||||||
|
|
||||||
|
kernel.elf: $(OBJECTS)
|
||||||
|
ld $(LDFLAGS) $^ -o $@
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
%.o: %.s
|
||||||
|
$(AS) $(ASFLAGS) $< -o $@
|
||||||
|
|
||||||
|
os.iso: kernel.elf
|
||||||
|
cp kernel.elf iso/boot/kernel.elf
|
||||||
|
mkisofs -R \
|
||||||
|
-b boot/grub/stage2_eltorito \
|
||||||
|
-no-emul-boot \
|
||||||
|
-boot-load-size 4 \
|
||||||
|
-A os \
|
||||||
|
-input-charset UTF-8 \
|
||||||
|
-quiet \
|
||||||
|
-boot-info-table \
|
||||||
|
-o os.iso \
|
||||||
|
iso
|
||||||
|
|
||||||
|
run: os.iso
|
||||||
|
qemu-system-i386 -cdrom $< -serial stdio #-d cpu
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm *.o kernel.elf os.iso
|
5
README.txt
Normal file
5
README.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Écriture d'un noyau de test basé sur The little book about OS development
|
||||||
|
(2015/01/19 - fe83e27dab3c39930354d2dea83f6d4ee2928212)
|
||||||
|
|
||||||
|
Suivez les instructions pour pouvoir compiler l'image avec Grub :
|
||||||
|
https://littleosbook.github.io/#obtaining-grub
|
17
framebuffer.c
Normal file
17
framebuffer.c
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#include "io.h"
|
||||||
|
#include "framebuffer.h"
|
||||||
|
|
||||||
|
void fb_write_cell(unsigned int i, char c, unsigned char fg, unsigned char bg)
|
||||||
|
{
|
||||||
|
char *fb = (char*) 0xB8000; // adresse du framebuffer
|
||||||
|
*(fb + i) = c;
|
||||||
|
*(fb + i + 1) = (fg & 0x0F) | ((bg & 0x0F) << 4); // little endian ??
|
||||||
|
}
|
||||||
|
|
||||||
|
void fb_move_cursor(unsigned short pos)
|
||||||
|
{
|
||||||
|
outb(FB_COMMAND_PORT, FB_HIGH_BYTE_COMMAND);
|
||||||
|
outb(FB_DATA_PORT, (pos >> 8) & 0x00FF);
|
||||||
|
outb(FB_COMMAND_PORT, FB_HIGH_BYTE_COMMAND);
|
||||||
|
outb(FB_DATA_PORT, pos & 0x00FF);
|
||||||
|
}
|
39
framebuffer.h
Normal file
39
framebuffer.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/** @file framebuffer.h */
|
||||||
|
|
||||||
|
#ifndef FRAMEBUFFER_H
|
||||||
|
#define FRAMEBUFFER_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def FB_COMMAND_PORT
|
||||||
|
* Le port pour pouvoir envoyer des instructions au curseur du framebuffer
|
||||||
|
*/
|
||||||
|
#define FB_COMMAND_PORT 0x3D4
|
||||||
|
/**
|
||||||
|
* @def FB_DATA_PORT
|
||||||
|
* Le port pour pouvoir envoyer des instructions au curseur du framebuffer
|
||||||
|
*/
|
||||||
|
#define FB_DATA_PORT 0x3D5
|
||||||
|
|
||||||
|
#define FB_HIGH_BYTE_COMMAND 14
|
||||||
|
#define FB_LOW_BYTE_COMMAND 15
|
||||||
|
|
||||||
|
#define FB_WHITE 0x0F
|
||||||
|
#define FB_BLACK 0x00
|
||||||
|
|
||||||
|
/**
|
||||||
|
* permet d'écrire dans un emplacement du framebuffer
|
||||||
|
*
|
||||||
|
* @param i l'emplacement où il faut écrire
|
||||||
|
* @param c le caractère
|
||||||
|
* @param fg la couleur du texte
|
||||||
|
* @param bg la couleur du fond du texte
|
||||||
|
*/
|
||||||
|
void fb_write_cell(unsigned int i, char c, unsigned char fg, unsigned char bg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* permet de déplacer le curseur du framebuffer
|
||||||
|
*
|
||||||
|
* @param pos la position où déplacer le curseur
|
||||||
|
*/
|
||||||
|
void fb_move_cursor(unsigned short pos);
|
||||||
|
#endif
|
6
io.h
Normal file
6
io.h
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#ifndef IO_H
|
||||||
|
#define IO_H
|
||||||
|
|
||||||
|
void outb(unsigned short port, unsigned char data);
|
||||||
|
|
||||||
|
#endif
|
11
io.s
Normal file
11
io.s
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
global outb
|
||||||
|
|
||||||
|
; permet de communiquer avec des ports
|
||||||
|
; pile : [ esp + 8 ] la valeur à écrire
|
||||||
|
; [ esp + 4 ] le port
|
||||||
|
; [ esp ] l'adresse de retour
|
||||||
|
outb:
|
||||||
|
mov al, [esp + 8]
|
||||||
|
mov dx, [esp + 4]
|
||||||
|
out dx, al
|
||||||
|
ret
|
33
kmain.c
Normal file
33
kmain.c
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#include "framebuffer.h"
|
||||||
|
|
||||||
|
int write(char *buf, unsigned int len)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
int pos = 0;
|
||||||
|
fb_move_cursor(ret);
|
||||||
|
|
||||||
|
while (ret < len)
|
||||||
|
{
|
||||||
|
fb_write_cell(pos, *(buf + ret), FB_WHITE, FB_BLACK);
|
||||||
|
ret++;
|
||||||
|
fb_move_cursor(ret);
|
||||||
|
|
||||||
|
pos += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int strlen(char *buf)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
while (*(buf + ret) != '\0') ret++;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void kmain(void)
|
||||||
|
{
|
||||||
|
char *str = "pouet pouet";
|
||||||
|
int len = strlen(str);
|
||||||
|
write(str, len);
|
||||||
|
}
|
26
link.ld
Normal file
26
link.ld
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
ENTRY(loader)
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
. = 0x00100000;
|
||||||
|
|
||||||
|
.text ALIGN (0x1000) :
|
||||||
|
{
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata ALIGN (0x1000) :
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
}
|
||||||
|
|
||||||
|
.data ALIGN (0x1000) :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss ALIGN (0x1000) :
|
||||||
|
{
|
||||||
|
*(COMMON)
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
}
|
35
loader.s
Normal file
35
loader.s
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
global loader ; symbole d'entrée pour le format ELF
|
||||||
|
|
||||||
|
; valeurs pour l'entête de multiboot (https://www.gnu.org/software/grub/manual/multiboot/html_node/Header-magic-fields.html#Header-magic-fields)
|
||||||
|
MAGIC_NUMBER equ 0x1BADB002 ; obligatoire
|
||||||
|
FLAGS equ 0x0 ; configuration de multiboot
|
||||||
|
CHECKSUM equ -MAGIC_NUMBER ; cf. documentation
|
||||||
|
|
||||||
|
KERNEL_STACK_SIZE equ 4096
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
align 4
|
||||||
|
kernel_stack:
|
||||||
|
resb KERNEL_STACK_SIZE
|
||||||
|
|
||||||
|
section .text
|
||||||
|
align 4
|
||||||
|
dd MAGIC_NUMBER
|
||||||
|
dd FLAGS
|
||||||
|
dd CHECKSUM
|
||||||
|
|
||||||
|
loader:
|
||||||
|
; écrite la lettre A dans le framebuffer
|
||||||
|
; mov word [0xB8000], 0x0F41
|
||||||
|
; le registre esp contient le pointeur vers la stack
|
||||||
|
mov esp, kernel_stack + KERNEL_STACK_SIZE
|
||||||
|
extern kmain
|
||||||
|
call kmain
|
||||||
|
;extern fb_write_cell
|
||||||
|
;push dword 0x00
|
||||||
|
;push dword 0x0F
|
||||||
|
;push dword 0x41
|
||||||
|
;call fb_write_cell
|
||||||
|
mov eax, 0xCAFEBABE
|
||||||
|
.loop:
|
||||||
|
jmp .loop
|
Loading…
Reference in a new issue