docs: preparation de la compilation de programmes en USER MODE (ring 3), ajout documentation API et librairies

This commit is contained in:
Nicolas Hordé 2018-12-09 13:44:32 +01:00
parent ac537030a3
commit f0f36a0f5c
15 changed files with 244 additions and 25 deletions

15
API.md Normal file
View File

@ -0,0 +1,15 @@
## Liste des API
Bibliothèques disponibles dans COS2000
### libc
Fonctions disponibles dans la librairie "libc"
#### test_api
u32 test_api(void);
syscall id : 0
arguments : 0
résultat : oui (0x66666666)

View File

@ -85,7 +85,7 @@
/* OS identification */ /* OS identification */
#define ELFOSABI_NONE 0 //No extensions or unspecified #define ELFOSABI_NONE 0 //No extensions or unspecified
#define ELFOSABI_LINUX 3 //Linux #define ELFOSABI_LINUX 3 //Linux
#define ELFOSABI_COS2000 15 //COS2000 #define ELFOSABI_COS2000 16 //COS2000
/* ELF header */ /* ELF header */
typedef struct elf32 { typedef struct elf32 {

View File

@ -5,13 +5,6 @@
#define sysexit() asm volatile ("sysexit"::); #define sysexit() asm volatile ("sysexit"::);
#define inb(port) ({ \
u8 _v; \
asm volatile ("inb %%dx,%%al" : "=a" (_v) : "d" (port)); \
_v; \
})
#define syscall0(syscall) ({ \ #define syscall0(syscall) ({ \
u32 _v; \ u32 _v; \
asm volatile (\ asm volatile (\

View File

@ -1,4 +1,4 @@
CC=gcc -O0 -g -nostdinc -ffreestanding -fno-builtin -Wall -w -m32 -F pe-i386 -I ../include CC=gcc -O0 -g -nostdinc -ffreestanding -fno-builtin -Wall -w -m32 -F elf_i386 -I ../include
LINK=ld -m elf_i386 -r -o LINK=ld -m elf_i386 -r -o
SRCS= $(wildcard *.c) SRCS= $(wildcard *.c)
OBJS= $(SRCS:.c=.o) OBJS= $(SRCS:.c=.o)

View File

@ -14,7 +14,7 @@ u32 lastpid;
u8 elf_errors1[]="Aucune signature ELF"; u8 elf_errors1[]="Aucune signature ELF";
u8 elf_errors2[]="Fichier au format ELF mais non 32 bits"; u8 elf_errors2[]="Fichier au format ELF mais non 32 bits";
u8 elf_errors3[]="ELF non MSB"; u8 elf_errors3[]="ELF non LSB";
u8 elf_errors4[]="ELF mauvaise version"; u8 elf_errors4[]="ELF mauvaise version";
u8 elf_errors5[]="ELF pour OS ne correspondant pas"; u8 elf_errors5[]="ELF pour OS ne correspondant pas";
u8 elf_errors6[]="Mauvais type de machine"; u8 elf_errors6[]="Mauvais type de machine";
@ -37,8 +37,6 @@ u32 elf_test(u8 *src)
&& header->e_ident[EI_MAG2] == ELFMAG2 && header->e_ident[EI_MAG3] == ELFMAG3) && header->e_ident[EI_MAG2] == ELFMAG2 && header->e_ident[EI_MAG3] == ELFMAG3)
{ {
if (header->e_ident[EI_CLASS]!=ELFCLASS32) if (header->e_ident[EI_CLASS]!=ELFCLASS32)
return 1;
if (header->e_ident[EI_DATA]!=ELFDATA2LSB)
return 2; return 2;
if (header->e_ident[EI_DATA]!=ELFDATA2LSB) if (header->e_ident[EI_DATA]!=ELFDATA2LSB)
return 3; return 3;

View File

@ -1,4 +1,4 @@
all: bits32 bits64 harddisk uefi all: programs bits32 bits64 harddisk uefi
sync sync
bits32: ARCH=bits32 bits32: ARCH=bits32
@ -9,6 +9,11 @@ bits64: ARCH=bits64
bits64: lib/libs.o system/system.sys bits64: lib/libs.o system/system.sys
sync sync
programs: programs/test
programs/test:
make -C programs
harddisk: final/harddisk.img.final harddisk: final/harddisk.img.final
uefi: final/harddiskuefi.img.final uefi: final/harddiskuefi.img.final
@ -17,20 +22,22 @@ install:
(sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils bochs bochs-x bochsbios) (sudo apt-get install nasm gcc qemu fusefat fuseext2 cgdb ovmf bsdmainutils tar bsdmainutils indent binutils bochs bochs-x bochsbios)
clean: clean:
(cd system; make clean) make -C system clean
(cd lib;make clean) make -C lib clean
(cd final;make clean) make -C final clean
make -C programs clean
sync sync
littleclean: littleclean:
(cd system; make clean) make -C system clean
(cd lib;make clean) make -C lib clean
(cd final;make littleclean) make -C final littleclean)
make -C programs clean
sync sync
indent: indent:
(cd system; make indent) make -C system indent
(cd lib;make indent) make -C lib indent
sync sync
backup: clean backup: clean
@ -85,13 +92,13 @@ qemu64:
(killall qemu-system-x86_64;qemu-system-x86_64 -m 5G -drive format=raw,file=./final/harddiskuefi.img.final --bios /usr/share/qemu/OVMF.fd --enable-kvm -cpu host -s &) (killall qemu-system-x86_64;qemu-system-x86_64 -m 5G -drive format=raw,file=./final/harddiskuefi.img.final --bios /usr/share/qemu/OVMF.fd --enable-kvm -cpu host -s &)
system/system.sys: system/system.sys:
(cd system; VESA=$(VESA) make) make -C system VESA=$(VESA)
final/harddisk.img.final: final/harddisk.img.final:
(cd final; make harddisk.img.final) make -C final harddisk.img.final
final/harddiskuefi.img.final: final/harddiskuefi.img.final:
(cd final; make harddiskuefi.img.final) make -C final harddiskuefi.img.final
lib/libs.o: lib/libs.o:
(cd lib; make) make -C lib

7
programs/include/libc.h Normal file
View File

@ -0,0 +1,7 @@
/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */
#include "types.h";
u32 test_api(void);

View File

@ -0,0 +1,44 @@
/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */
#define syscall0(syscall) ({ \
u32 _v; \
asm volatile (\
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (_v) : "a" (syscall): "ecx","edx","memory"); \
_v; \
})
#define syscall1(syscall,arg1) ({ \
u32 _v; \
asm volatile (\
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (_v) : "a" (syscall), "b" (arg1) : "ecx","edx","memory"); \
_v; \
})
#define syscall2(syscall,arg1,arg2) ({ \
u32 _v; \
asm volatile (\
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (_v) : "a" (syscall), "b" (arg1), "S" (arg2) : "ecx","edx","memory"); \
_v; \
})
#define syscall3(syscall,arg1,arg2,arg3) ({ \
u32 _v; \
asm volatile (\
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (_v) : "a" (syscall), "b" (arg1), "S" (arg2), "D" (arg3) : "ecx","edx","memory"); \
_v; \
})

70
programs/include/types.h Executable file
View File

@ -0,0 +1,70 @@
/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */
#ifndef ALLTYPES
# define ALLTYPES
typedef char int8;
typedef short int16;
typedef int int32;
typedef long long int64;
typedef char BYTE;
typedef short WORD;
typedef long DWORD;
typedef long long QWORD;
typedef signed char SBYTE;
typedef signed short SWORD;
typedef signed long SDWORD;
typedef signed long long SQWORD;
typedef unsigned char UBYTE;
typedef unsigned short UWORD;
typedef unsigned long UDWORD;
typedef unsigned long long UQWORD;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long int u64;
typedef char s8;
typedef short s16;
typedef int s32;
typedef long int s64;
typedef int bool;
extern char ctype[];
#define true 1
#define false 0
#define NULL 0x0000
#define CT_UP 0x01 /* upper case */
#define CT_LOW 0x02 /* lower case */
#define CT_DIG 0x04 /* digit */
#define CT_CTL 0x08 /* control */
#define CT_PUN 0x10 /* punctuation */
#define CT_WHT 0x20 /* white space (space/cr/lf/tab) */
#define CT_HEX 0x40 /* hex digit */
#define CT_SP 0x80 /* hard space (0x20) */
/* without the cast to unsigned, DJGPP complains (using -Wall) */
#define isalnum(c) ((ctype + 1)[(unsigned)(c)] & (CT_UP | CT_LOW | CT_DIG))
#define isalpha(c) ((ctype + 1)[(unsigned)(c)] & (CT_UP | CT_LOW))
#define iscntrl(c) ((ctype + 1)[(unsigned)(c)] & (CT_CTL))
#define isdigit(c) ((ctype + 1)[(unsigned)(c)] & (CT_DIG))
#define isgraph(c) ((ctype + 1)[(unsigned)(c)] & (CT_PUN | CT_UP | CT_LOW | CT_DIG))
#define islower(c) ((ctype + 1)[(unsigned)(c)] & (CT_LOW))
#define isprint(c) ((ctype + 1)[(unsigned)(c)] & (CT_PUN | CT_UP | CT_LOW | CT_DIG | CT_SP))
#define ispunct(c) ((ctype + 1)[(unsigned)(c)] & (CT_PUN))
#define isspace(c) ((ctype + 1)[(unsigned)(c)] & (CT_WHT))
#define isupper(c) ((ctype + 1)[(unsigned)(c)] & (CT_UP))
#define isxdigit(c) ((ctype + 1)[(unsigned)(c)] & (CT_DIG | CT_HEX))
#define isascii(c) ((unsigned)(c) <= 0x7F)
#define toascii(c) ((unsigned)(c) & 0x7F)
#define tolower(c) (isupper(c) ? c + 'a' - 'A' : c)
#define toupper(c) (islower(c) ? c + 'A' - 'a' : c)
#endif

12
programs/lib/libc.c Normal file
View File

@ -0,0 +1,12 @@
/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */
#include "libc.h";
#include "syscall.h";
#include "types.h";
u32 test_api(void)
{
syscall0(0x0);
}

26
programs/lib/makefile Executable file
View File

@ -0,0 +1,26 @@
CC=gcc -O0 -g -nostdinc -ffreestanding -fno-builtin -Wall -w -m32 -F elf-i386 -I ../include
LINK=ld -m elf_i386 -r -o
SRCS= $(wildcard *.c)
OBJS= $(SRCS:.c=.o)
ARCH=ar rcs
all: makeall
makeall: libs.a
libs.a:libs.o
$(ARCH) $@ $^
libs.o:$(OBJS)
$(LINK) libs.o $(OBJS)
.o: .c
$(CC) $^
clean:
rm -f *.o
rm -f *.c~
rm -f *.a
indent:
indent -linux -i8 -ts8 *.c

12
programs/linker.lds Normal file
View File

@ -0,0 +1,12 @@
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(main)
SECTIONS
{
. = 0x40000000;
.text ALIGN(16): {
*(.text)
}
}

24
programs/makefile Executable file
View File

@ -0,0 +1,24 @@
CC=gcc -O0 -g -nostdinc -ffreestanding -fno-builtin -Wall -w -m32 -I ./include -c -o
LINK=ld -m elf_i386 -T linker.lds -n -o
SRCS= $(wildcard *.c)
EXECS= $(SRCS:.c=)
all: lib/libs.a $(EXECS)
lib/libs.a:
make -C lib
%: %.c
$(CC) $@.o $<
$(LINK) $@ $@.o lib/libs.a
chmod 644 $@
elfedit --output-osabi FenixOS $@
clean:
make -C lib clean
rm -f *.o
rm -f *.c~
find . -type f ! -perm /u=x -maxdepth 1 -regex '.+/\.?[^\.]+' -exec rm {} \;
indent:
indent -linux -i8 -ts8 *.c

11
programs/test.c Normal file
View File

@ -0,0 +1,11 @@
/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */
#include "libc.h";
#include "types.h";
void main(void)
{
test_api();
}