Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Nicolas Hordé | ff367b8462 | |
Nicolas H | 14fe26752f |
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
88
README.md
88
README.md
|
@ -1,13 +1,15 @@
|
|||
![logo](https://github.com/dahut87/cos2000v2/raw/master/Graphisme/logo.png)
|
||||
|
||||
## Présentation du projet
|
||||
## COS2000
|
||||
|
||||
### Qu'est ce que COS2000 ?
|
||||
### Présentation du projet
|
||||
|
||||
COS2000 est un système d'exploitation minimaliste qui vise essentiellement un objectif pédagogique.
|
||||
#### Qu'est ce que COS2000 ?
|
||||
|
||||
COS2000 est un système d'exploitation minimaliste dont l'objectif est essentiellement pédagogique.
|
||||
Il s'agit avant tout du travail d'un passionné de programmation système.
|
||||
|
||||
Le système est développé essentiellement en langage C mais il comporte aussi un peu d'assembleur X86.
|
||||
Le système est développé essentiellement en langage C mais il comporte aussi quelques lignes d'assembleur X86.
|
||||
|
||||
#### Qu'est ce qu'un système d'exploitation ?
|
||||
|
||||
|
@ -23,9 +25,7 @@ Sans système d'exploitation votre ordinateur est inopérant: c'est une boite vi
|
|||
|
||||
#### Comment utiliser COS2000 ?
|
||||
|
||||
COS2000 n'a pas pour but d'être utilisé en production. Il s'agit d'un système en cours de
|
||||
développement que vous pouvez néanmoins tester sur un ordinateur physique ou de préférence sur une machine virtuelle.
|
||||
Il est nécessaire de compiler le système avant de démarrer celui-ci à partir d'un périphérique amovible (clé usb).
|
||||
COS2000 n'a pas pour but d'être utilisé en production. Il s'agit d'un système en cours de développement que vous pouvez néanmoins tester sur un ordinateur physique ou de préférence sur une machine virtuelle. Il est nécessaire de compiler le système avant de démarrer celui-ci à partir d'un périphérique amovible (clé usb).
|
||||
|
||||
#### Sur quel ordinateur fonctionne t'il ?
|
||||
|
||||
|
@ -45,13 +45,85 @@ Les détails se trouvent dans le fichier `LICENSE.md`
|
|||
|
||||
![logo](https://www.gnu.org/graphics/lgplv3-with-text-154x68.png)
|
||||
|
||||
### Compilation de COS2000
|
||||
|
||||
#### Logiciels utilisés
|
||||
|
||||
L'OS a été développé sous Linux afin de disposer d'un maximum d'outils dont GCC/NASM/Docker et l'ensemble des BINUTILS. Je vous conseille donc d'utiliser Linux afin de procéder à la compilation même si celle-ci peut fonctionner depuis Windows grace à Cygwin. Des distributions "Live" existent si vous ne souhaitez pas installer sur votre ordinateur (http://www.linuxmint.com/edition.php?id=259).
|
||||
|
||||
Le système de conteneurisation Docker est exploité afin de d'assurer une reproductibilité totale de l'environnement de compilation quelque soit le système d'exploitation utilisé.
|
||||
|
||||
#### Installation/compilation automatique
|
||||
|
||||
Téléchargez et exécutez le script d'installation automatique et de compilation "menu.sh"
|
||||
|
||||
`wget https://raw.githubusercontent.com/dahut87/cos2000v2/master/menu.sh`
|
||||
|
||||
Executez le script et les sources seront ainsi automatiquement téléchargées sur votre ordinateur par le biais de Git.
|
||||
|
||||
`chmod 755 ./menu.sh && ./menu.sh`
|
||||
|
||||
Un menu s'affiche ensuite qui vous propose de réaliser différentes tâches dont la compilation et/ou le test de COS2000.
|
||||
|
||||
![Menu de compilation](https://github.com/dahut87/cos2000v2/raw/master/Graphisme/screenshots/compilation.png)
|
||||
|
||||
#### Installation/compilation manuelle
|
||||
|
||||
##### Téléchargement de COS2000
|
||||
|
||||
Afin de faciliter la mise à jour et le suivi des version de COS2000, GIT est utilisé.
|
||||
|
||||
Si vous n'avez pas GIT, installez le avec la commande suivante (sous paquet debian .deb):
|
||||
|
||||
`sudo apt-get install git`
|
||||
|
||||
Puis cloner le source chez vous avec la commande :
|
||||
|
||||
`git clone https://github.com/dahut87/cos2000.git`
|
||||
|
||||
##### Compilation en ligne de commande
|
||||
|
||||
Docker est utilisé afin de permettre le fonctionnement correcte de la compilation. Au premier lancement de make.sh, si vous utilisez une distribution basée sur le système de paquet Debian, l'installation sera réalisée automatiquement. Dans le cas contraire, installez Docker et relancez le script. Une image docker est produite afin de procéder ensuite à la compilation du système.
|
||||
|
||||
Commande de compilation de base
|
||||
|
||||
* `./make.sh all` compile tout le projet dans sa version disquette
|
||||
|
||||
Autres commandes de compilation de COS2000
|
||||
* `./make.sh test` lance l'émulation QEMU en 32 bits sur disquette
|
||||
* `./make.sh clean` supprime les fichers compilés
|
||||
* `./make.sh debug-boot` debogue le système en mode réel depuis le boot
|
||||
* `./make.sh debug-loader` debogue le système en mode réel depuis le loader
|
||||
* `./make.sh debug-system` debogue le système en mode protégé
|
||||
* `./make.sh config` change la configuration de la compilation
|
||||
|
||||
### Utilisation
|
||||
|
||||
#### Sur un ordinateur émulé
|
||||
|
||||
Pour tester l'OS en émulation taper donc la commande `./make.sh test` qui compilera avant de lancer Qemu.
|
||||
|
||||
#### Commandes de COS2000
|
||||
|
||||
Pour l'instant quelques commandes seulement sont disponibles:
|
||||
|
||||
* `REBOOT` redémarre le PC,
|
||||
* `CLEAR` efface l'écran,
|
||||
* `MODE` change le mode video,
|
||||
* `DETECTCPU` detecte et affiche les informations CPU,
|
||||
* `DETECTPCI` detecte et affiche les périphériques PCI,
|
||||
* `TEST2D` teste l'affichage graphique 2D,
|
||||
* `HELP` affiche les commandes disponibles.
|
||||
|
||||
![COS2000 le 28-09-2018](https://github.com/dahut87/cos2000v2/raw/master/Graphisme/screenshots/ansi.png)
|
||||
|
||||
### En savoir plus...
|
||||
|
||||
#### Historique du projet
|
||||
* Version 2.2fr - C en mode protégé Reprise du projet
|
||||
* Version 2.1fr - C en mode protégé Abandon du projet
|
||||
* Version 2.0 - C en mode protégé VGA text+pmode
|
||||
* Version 1.x - Assembleur en mode réel
|
||||
* Version 1.x - Assembleur en mode réel (v1.0 - 1.4.2fr)
|
||||
|
||||
> “La connaissance s'acquiert par l'expérience,
|
||||
> tout le reste n'est que de l'information..
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
FROM alpine:3.12.0
|
||||
RUN echo "http://alpine.42.fr/v3.12/main" > /etc/apk/repositories
|
||||
RUN echo "http://alpine.42.fr/v3.12/community" >> /etc/apk/repositories
|
||||
RUN apk --no-cache update
|
||||
RUN apk --no-cache upgrade
|
||||
RUN apk --no-cache add font-noto git gcc make qemu qemu-system-i386 dosfstools nasm sed gdb tar wget gzip indent binutils hexdump dos2unix xxd tmux git musl-dev gnome-terminal spice-gtk spice-gtk-tools python2
|
||||
RUN mkdir /data
|
||||
WORKDIR /data
|
|
@ -0,0 +1,7 @@
|
|||
FROM debian:10
|
||||
|
||||
RUN apt-get update -yq \
|
||||
&& apt-get install --no-install-recommends gcc make qemu dosfstools gdb psmisc tmux git libc6-dev bsdmainutils tar wget bsdmainutils indent binutils xxd dos2unix nasm gnome-terminal spice-client-gtk python2.7 qemu-system-x86 -yq \
|
||||
&& apt-get clean -y
|
||||
RUN mkdir /data
|
||||
WORKDIR /data
|
|
@ -2,11 +2,11 @@ all: cos2000.img
|
|||
|
||||
cos2000.img:
|
||||
(dd if=/dev/zero of=cos2000.img count=2880 bs=512)
|
||||
(mkfs.msdos -F 12 -n "COS2000" cos2000.img)
|
||||
(fusefat cos2000.img ./mnt -o rw+)
|
||||
(mkfs.msdos -F 12 -n "COS2000" cos2000.img;mkdir ./mnt || true)
|
||||
(mount -t vfat cos2000.img ./mnt -o rw)
|
||||
(cp ../boot/loader.sys ./mnt/)
|
||||
(cp ../system/system.sys ./mnt/;sync)
|
||||
(fusermount ./mnt -u)
|
||||
(umount ./mnt)
|
||||
(dd if=../boot/boot12.bin of=cos2000.img seek=0 count=1 conv=notrunc;sync)
|
||||
|
||||
clean:
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
#!/bin/bash
|
||||
|
||||
function tool {
|
||||
echo "*** Fabrication des outils de compilation par Docker (version ${VERSION} config ${CONFIGURATION})"
|
||||
docker build - -t $COMPILER < ./docker/dockerfile.${CONFIGURATION}
|
||||
}
|
||||
|
||||
function configuration {
|
||||
echo "*** Création du fichier de configuration"
|
||||
echo -en "compilation=alpine\nvideo=vesa" > ./configuration
|
||||
}
|
||||
|
||||
echo "Autorisation de docker à se connecter à l'écran :0"
|
||||
xhost +local:docker
|
||||
PWD=$(pwd)
|
||||
FILE=${PWD}/configuration
|
||||
if [ ! -f "$FILE" ]; then
|
||||
configuration
|
||||
fi
|
||||
DOCKER=$(docker -v| grep build)
|
||||
if [ "${DOCKER}" == "" ]; then
|
||||
echo "Docker n'est pas installé..."
|
||||
echo "*** installation si sous gestionnaire de paquet debian (.deb)"
|
||||
sudo apt-get install docker
|
||||
exit
|
||||
fi
|
||||
CONFIGURATION=$(sed -rn 's/^compilation=([^\n]+)$/\1/p' ./configuration)
|
||||
VERSION=$(git rev-parse --short HEAD)
|
||||
COMPILER=cos2000-compiler-${CONFIGURATION}-${VERSION}
|
||||
if [ "$1" == "tool" ]; then
|
||||
tool
|
||||
exit
|
||||
fi
|
||||
if [ "$1" == "configuration" ]; then
|
||||
configuration
|
||||
exit
|
||||
fi
|
||||
PRESENT=$(docker image ls| grep $COMPILER)
|
||||
if [ "${PRESENT}" == "" ]; then
|
||||
tool
|
||||
fi
|
||||
echo "*** lancement de la version ${VERSION}"
|
||||
if [ "$1" == "config" ]; then
|
||||
docker run --rm -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged -v ${PWD}:/data $COMPILER make $1
|
||||
else
|
||||
docker run --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --privileged -v ${PWD}:/data $COMPILER make $1
|
||||
fi
|
31
makefile
31
makefile
|
@ -3,41 +3,44 @@ all: makall
|
|||
makall: boot/boot12.bin lib/libs.o system/system.sys
|
||||
sync
|
||||
|
||||
install:
|
||||
(sudo apt-get install nasm gcc qemu fusefat cgdb)
|
||||
|
||||
clean:
|
||||
(cd system; make clean)
|
||||
(cd boot; make clean)
|
||||
(cd lib;make clean)
|
||||
(cd final;make clean)
|
||||
rm -f configuration
|
||||
sync
|
||||
|
||||
backup: clean
|
||||
(cd .. ; tar cf - cosc | gzip -f - > backup.tar.gz ; cd cosc)
|
||||
(tar cf - . | gzip -f - > backup.tar.gz)
|
||||
|
||||
copy:
|
||||
(cd final; make)
|
||||
|
||||
test: all copy qemu
|
||||
|
||||
killer:
|
||||
killall qemu-system-i386 || true
|
||||
|
||||
view:
|
||||
(hexdump -C ./final/cos2000.img|head -c10000)
|
||||
|
||||
debug-boot: all copy qemu-debug
|
||||
(sleep 2;cgdb -x ./debug/boot.txt)
|
||||
(sleep 2;cgdb -x ./debug/boot.txt;spicy --uri=spice://127.0.0.1?port=5900)
|
||||
|
||||
debug-loader: all copy qemu-debug
|
||||
(sleep 2;cgdb -x ./debug/loader.txt)
|
||||
(sleep 2;cgdb -x ./debug/loader.txt;spicy --uri=spice://127.0.0.1?port=5900)
|
||||
|
||||
debug-system: all copy qemu-debug
|
||||
(sleep 2;cgdb -x ./debug/system.txt)
|
||||
(sleep 2;cgdb -x ./debug/system.txt;spicy --uri=spice://127.0.0.1?port=5900)
|
||||
|
||||
qemu-debug:
|
||||
(qemu-system-i386 -m 1G -fda ./final/cos2000.img -s -S &)
|
||||
(qemu-system-i386 -vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing -m 1G -fda ./final/cos2000.img -s -S &)
|
||||
|
||||
qemu:
|
||||
(qemu-system-i386 -m 1G -fda ./final/cos2000.img -s)
|
||||
qemu-system-i386 -vga qxl -spice port=5900,addr=127.0.0.1,disable-ticketing -m 1G -fda ./final/cos2000.img -s &
|
||||
sleep 2
|
||||
spicy --uri=spice://127.0.0.1?port=5900
|
||||
|
||||
system/system.sys:
|
||||
(cd system; make)
|
||||
|
@ -47,3 +50,13 @@ boot/boot12.bin:
|
|||
|
||||
lib/libs.o:
|
||||
(cd lib; make)
|
||||
|
||||
config:
|
||||
@echo "*** Options de compilation"
|
||||
@echo "Quelle distribution utiliser avec Docker comme environnement de compilation ?"
|
||||
@echo "Alpine Linux ou Debian [A*/D]"
|
||||
@read line; if [ $$line = "D" ]; then sed -i -r 's/compilation=.*/compilation=debian/' configuration ; else sed -i -r 's/compilation=.*/compilation=alpine/' configuration ; fi
|
||||
@echo "Quel mode vidéo préférez vous utiliser ?"
|
||||
@echo "VESA ou VGA [E*/G]"
|
||||
@read line; if [ $$line = "G" ]; then sed -i -r 's/video=.*/video=vga/' configuration ; else sed -i -r 's/video=.*/video=vesa/' configuration ; fi
|
||||
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
#!/bin/bash
|
||||
PWD=$(pwd)
|
||||
FILE=${PWD}/README.md
|
||||
if [ ! -f "$FILE" ]; then
|
||||
echo "Les sources ne sont pas complets..."
|
||||
echo "* Récupération des sources"
|
||||
VERSION=$(git --version|grep version)
|
||||
if [ "${VERSION}" == "" ]; then
|
||||
echo "Git n'est pas installé, veuillez l'installer et relancer le script"
|
||||
fi
|
||||
git clone https://github.com/dahut87/cos2000v2.git
|
||||
cd ${PWD}/cos2000v2
|
||||
git checkout master
|
||||
git clean -fd
|
||||
git reset --hard
|
||||
rm -rf ../menu.sh
|
||||
fi
|
||||
while true
|
||||
do
|
||||
clear
|
||||
echo "**********************************************************"
|
||||
echo "* COS2000 - menu de compilation *"
|
||||
echo "**********************************************************"
|
||||
echo
|
||||
echo "1 Compilation des sources"
|
||||
echo "2 Emulation de COS2000"
|
||||
echo "3 Débuguage de COS2000 boot en mode réel (boot)"
|
||||
echo "4 Débuguage de COS2000 boot en mode réel (loader)"
|
||||
echo "5 Débuguage de COS2000"
|
||||
echo "6 Réalisez une sauvegarde"
|
||||
echo "7 Tuer tout les processus"
|
||||
echo "8 Nettoyer les sources"
|
||||
echo "9 Voir le disque en hexadécimal"
|
||||
echo "c Changer la version de developpement"
|
||||
echo "o Changer les options de développement"
|
||||
echo "0 Quitter"
|
||||
echo "------------------------------------------"
|
||||
echo "Choisissez l'action à réaliser..."
|
||||
read answer
|
||||
clear
|
||||
case "${answer}" in
|
||||
0) exit;;
|
||||
1) ./make.sh all;;
|
||||
2) ./make.sh test;;
|
||||
3) ./make.sh debug-boot;;
|
||||
4) ./make.sh debug-loader;;
|
||||
5) ./make.sh debug-system;;
|
||||
6) ./make.sh backup;;
|
||||
7) ./make.sh killer;;
|
||||
8) ./make.sh clean;;
|
||||
9) ./make.sh view|more;;
|
||||
o*) ./make.sh config
|
||||
./make.sh tool
|
||||
;;
|
||||
c*) echo "Version disponibles:"
|
||||
SELECT=$(git branch|grep "*"|tr -d "* ")
|
||||
NUM=1
|
||||
echo "XX Hash d'une révision particulière"
|
||||
while read LINE
|
||||
do
|
||||
echo "${NUM} ${LINE}"
|
||||
(( NUM++ ))
|
||||
done < <(git branch -lr|tr -d "* "|grep -v HEAD|sed s/".*origin\/"//)
|
||||
read -p"?" ANSWER
|
||||
COUNT=$(echo -n ${ANSWER}|wc -c)
|
||||
if [ "${COUNT}" == "1" ]; then
|
||||
CHOOSE=$(git branch -lr|tr -d "* "|grep -v HEAD|sed s/".*origin\/"//|tr "\n" " "|cut -d " " -f${ANSWER})
|
||||
echo "vous avez selectionné une branche $CHOOSE..."
|
||||
else
|
||||
EXIST=$(git show ${ANSWER})
|
||||
if [ "${EXIST}" != "" ]; then
|
||||
CHOOSE=${ANSWER}
|
||||
echo "vous avez selectionné une révision ${choose}..."
|
||||
fi
|
||||
fi
|
||||
if [ "${CHOOSE}" != "" ]; then
|
||||
echo "*** Application de la version ${CHOOSE}"
|
||||
git checkout $CHOOSE
|
||||
git clean -fd
|
||||
git reset --hard
|
||||
git pull -f
|
||||
./make.sh tool
|
||||
fi
|
||||
read
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
done
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue