[Asm] Mon système d'exploitation

Statut
N'est pas ouverte pour d'autres réponses.

Gegurion

Casse Couille
Franchement, je comprends rien a tout ça, mais je te souhaite bon courage, et surtout bonne merde ! :-D
 

Gatchan77

Met Romana op de scooter
ça faisait longtemps que j'avais plus vu du code ASM. Ce truc de barbare ... :=)
 

Froggy

fake geek
tiens au fait ... quels sont les services que doit fournir un kernel ? :)
 

Ezekiel !

Elite
et quoi l'anti cheat il en est ou :p ?
 
Si tu es sur Bruxelles, te conseillerais de te procurer les cours de l'ESI en Operating System :p

Bonne merte quand mm :p
 

Dieu Bisounours

Créateur de Dieu
PunkDeLuxe a dit:
Si tu es sur Bruxelles, te conseillerais de te procurer les cours de l'ESI en Operating System :p

Bonne merte quand mm :p
Pour en faire du papier toilette?
 
1er
OP
neku

neku

Codeur roumain
Alors voila l'avancement :
- Démarre la machine
- Load un kernel
- Initialisation GDT
- Passage en mode protégé
- Execution du kernel
- Le kernel éfface l'écran
- Le kernel affiche un message à l'écran
- Le kernel se lance dans une boucle infinie ;)

Les fichiers :

bootsect.asm
Code:
%define BASE 0x100
%define KSIZE 24	;Nombre de secteur de 512 octets à charger

[BITS 16]
[ORG 0x0]
	jmp start
	
%include "fonctions.asm"

bootdrv:	db	0

;Messages
msg_start	db	'Starting...',10,13,0
msg_loadk	db	'Loading Kernel ...',10,13,0

start:
	mov [bootdrv], dl

	;Initialisation des segments en 0x07C0
	mov ax, 0x07C0
	mov ds, ax
	mov es, ax

	;Stack en 0xFFFF
	mov ax, 0x8000
	mov ss, ax
	mov sp, 0xF000
	
	;On affiche un message
	mov si, msg_start
	call print
	
;load:
	xor ax, ax
	int 0x13
	
	push es
	mov ax, BASE
	mov es, ax
	mov bx, 0
	
	mov ah, 2
	mov al, KSIZE
	mov ch, 0
	mov cl, 2
	mov dh, 0
	mov dl, [bootdrv]
	int 0x13
	pop es
	
	;Initialisation du pointeur sur la GDT
	mov ax, gdtend
	mov bx, gdt
	sub ax, bx
	mov word [gdtptr], ax
	
	xor eax, eax
	xor ebx, ebx
	mov ax, ds
	mov ecx, eax
	shl ecx, 4
	mov bx, gdt
	add ecx, ebx
	mov dword [gdtptr+2], ecx
	
	;Passage en pmode (Mode protégé)
	cli
	lgdt [gdtptr]
	mov eax, cr0
	or ax, 1
	mov cr0, eax
	
	jmp next
	
next:
	mov ax, 0x10
	mov ds, ax
	mov fs, ax
	mov gs, ax
	mov es, ax
	mov ss, ax
	mov esp, 0x9F000
	
	;saut vers le Kernel
	jmp dword 0x8:0x1000
	
hang:
	jmp hang
	
gdt:
	db 0,0,0,0,0,0,0,0
gdt_cs:
	db 0xFF,0xFF,0x0,0x0,0x0,10011011b,11011111b,0x0
gdt_ds:
	db 0xFF,0xFF,0x0,0x0,0x0,10010011b,11011111b,0x0
gdtend:

gdtptr:
	dw	0
	dd	0
	
;NOP jusqu'à 510
times 510-($-$$) db 0
dw 0xAA55
fonction.asm
Code:
;===============
;Print
;===============
print:	;Fonction permettant l'affichage de message à l'écran
	lodsb	;en utilisant l'interruption 10h
	
	or al, al	;Si al = 0
	jz done	;Done
	
	mov ah, 0Eh
	mov bx, 0007
	int 0x10
	
	jmp print
done:
	ret
;===============
;/Print
;===============
kernel.c
Code:
extern void scrollup (unsigned int);
extern void print (char *);
extern void clrscr (void);

int main();

void _start (void) 
{
	main();
}

int main (void) 
{
	clrscr();
	print("un message\n");
	while(1);
}
inludes/conio.h
Code:
#ifndef _CONIO_H_
#define _CONIO_H_

	void scrollup (unsigned int);
	void print (char*);
	void clrscr (void);

#endif
includes/screen.h
Code:
#ifndef _SCREEN_H_
#define _SCREEN_H_

	#define RAMSCREEN 0xB8000
	#define SIZESCREEN 0xFA0
	#define SCREENLIM 0xB8FA0

	extern char kX;
	extern char kY;
	extern char kattr;

#endif
sources/screen.c
Code:
#include "../includes/screen.h"

	char kX = 0;
	char kY = 10;
	char kattr = 0x07;
sources/print.c
Code:
#include "../includes/screen.h"
#include "../includes/conio.h"

void print (char* string)
{
	char* ptr;
	unsigned char* video;
	ptr = string;
	
	while (*ptr != 0) 
	{
		if (*ptr == 10) {
			kX = 0;
			kY++;
		}
		else {
			video = (unsigned char*) (RAMSCREEN + 2 * kX + 160 * kY);
			*video = *ptr;
			*(video + 1) = kattr;
			
			kX++;
			if (kX > 79) {
				kX = 0;
				kY++;
			}
		}
		ptr++;
		
		if (kY > 24) {
			scrollup (kY - 24);
		}
	}
}
sources/scrollup.c
Code:
#include "../includes/screen.h"
#include "../includes/conio.h"

void scrollup (unsigned int nline)
{
	unsigned char* video;
	unsigned char* tmp;
	
	for (video=(unsigned char*)RAMSCREEN ; video<(unsigned char*)SCREENLIM ; video++)
	{
		tmp = (unsigned char*) (video + nline * 160);
		
		if (tmp < (unsigned char*)SCREENLIM) {
			*video = *tmp;
		}
		else {
			*video = 0;
		}
	}
	
	kY -= nline;
	if (kY < 0) {
		kY = 0;
	}
}
sources/clrscr.c
Code:
#include "../includes/screen.h"
#include "../includes/conio.h"

void clrscr(void)
{
	unsigned char* video;
	
	for (video = (unsigned char*)RAMSCREEN; video < (unsigned char*)SCREENLIM; video++)
	{
		*video = 0x0;
	}
	
	kX = 0;
	kY = 0;
}
Désoler pour le manque de commentaire, je penserai à mettre ca desque j'ai le temps ;)
 

Sedeete

NEOLIKE
C'est un fou :maboul: C'est un fou :maboul: !

Non sérieusement je suis très admiratif !
Bonne chance à toi, je te souhaite la plus grande réussite !
 
Hooo Hoo :gne:
Respect la :-D :applaus:
Bon courage et surtout amuse toi bien !! Je vais suivre également ce sujet, car c'est pationant et ca m'intéresse de comprendre comment ca fonctionne !! (pour l'instant ca va, je suis que +/- largué :p je comprend quand même certain trucs ^^ lool)
 
1er
OP
neku

neku

Codeur roumain
Alors voila, je vais faire un petit mot d'explication sur ce que j'ai déjà fait.

Programmer un noyau est un bon moyen de comprendre comment fonctionne un système d'exploitation. Mais cela demande du temps, de la patience et des nerfs solides :p

Qu'est-ce qu'un secteur de boot ?

Un secteur de boot est un programme situé sur le premier secteur de disque d'une unité de stockage ou d'une partition et qui est chargé au démarrage du PC. Le programme de ce secteur à en principe pour tâche de charger un noyau en mémoire et de l'exécuter. Ce noyau peut être présent au départ sur une disquette, un disque dur, une bande ou tout autre support magnétique.

Pourquoi notre secteur de boot ne peut pas dépasser 512 octets ?

Notre secteur de boot dis comme plus haut doit se situer sur le 1er secteur du support et ne peut donc pas être plus grand que un secteur.
Dans notre cas le secteur de boot se situe sur un disquette.
Sur une disquette un secteur à pour taille 512 octets.

Qu'est-ce que le Real mode et le Protect mode ?

Real mode :
Le mode dit "réel" est le mode dans lequel la machine se trouve au moment de son démarrage.
Ce mode fonctionne en 16 bits.
Pourquoi en 16 bits alors que les processeurs actuelle gère très bien le 32 bits ?
Cela remonte à l'époque où le 32 bits existait pas, lorsque le 32 bits est apparut pour garder la compatibilité avec le Os 16bits (ex : MS-DOS), il fut décidé de laisser la machine démarrer en 16 bits et de permettre au développeur de basculer en 32 bits par la suite (protect mode).
Il faut savoir aussi que le mode "réel" ne permet pas plus de 1mo d'allocation de mémoire.

Protect mode :
Le mode dit "protégé" permet d'exploiter les hautes performances du microprocesseur.
Ce mode permet l'adressage de 4Go de mémoire et fournit un support de l'implémentation de système multitaches et multi-utilisateurs.
L'inconvénient du mode protégé c'est que l'accès au routine du BIOS pour acceder au différents périphérique est vérouillé donc tout les drivers sont à réécrire.

Comment passer du mode réel au mode protégé ?

Cela est très simple, il suffit de modifier le bit 0 du registre CR0 à 1
Code:
mov eax, cr0
or ax, 1
mov cr0, eax
Comment afficher quelque chose à l'écran sans utiliser l'intérruption 0x13 du BIOS ?

Il faut savoir que la mémoire vidèo est mappée en mémoire à l'adresse physique 0xB8000 et s'étend jusque 0xB8FA0 pour le mode d'affichage 80x25
Pour afficher un caractère nous avons besoin de 2 octets, le premier octets pour le caractère et le second pour les attributs (clignotant, couleur arrière, surintensité, couleur texte)

ex :
si l'on place 'H' à 0xB8000
et 0x57 à 0xB8001

Code:
mov byte [0xB8000], 'H'
mov byte [0xB8001], 0x57
on obtiendra un H majuscule en au à gauche de l'écran en blanc sur fonc magenta

Quel est le code couleur ?

Un octet est composé de 8 bits
le premier bit définit si le caractère est clignotant
les 3 suivants la couleur de l'arrière plan
le suivant la suritensité
et les 3 derniers la couleur du texte

000 noir
001 bleu
010 vert
011 cyan
100 rouge
101 magenta
110 jaune
111 blanc

On peut en déduire que c'est du RVB (Rouge, vert, bleu) à 0 ou 1, 1 étant la lumiosité maximale de la couleur et 0 la minimale.

revenons à notre H
- Non clignotant
- Fond magenta
- Surintensité normal
- Ecrit blanc

0|101|0|111
On converti en Hexa et on obtient 57 ;)

Comment éffacer l'écran ?

Cela est très simple, il suffit de remplir chaque octets de 0, c'est-à-dire pas de caractère ecrit en noir sur fond noir.
Résultat l'écran est éffacé en noir.
 

paf_

rider // gsxr600 k5
Et bien ... comment dire ... bonne merde :-9

Tu prédit la sortie de la beta quand ça ?
 

Gatchan77

Met Romana op de scooter
j'ai eu 2 ans de cours d'ASM et quand je vois ce que tu veux faire je dis : Chapeau (ou alors maso !!)

Jamais aimé ce langage ... (surtout que j'ai raté ma 1ère info en partie à cause de ce cours)
 
1er
OP
neku

neku

Codeur roumain
Voici un petit screenshot du résultat actuel

 
Dieu Bisounours a dit:
Pour en faire du papier toilette?
Comme documentation ;) ... enfin ca tu dois p-e pas comprendre non plus :?

Et sinon bah chapeau ^^ j'attend de voir ce que ca donne
 

Groszours

Elite
Ca a l'air prometteur ! :=)

Si tu cherches des betas testeurs lambda fait moi signe! =]
 
1er
OP
neku

neku

Codeur roumain
Dernierement ajouté :

- Detection carte VESA + affichage de certaines informations sur celle-ci si trouvée :
OEM Name
Quantité VRAM
Signature​
- Calcule de la quantité de RAM + Affichage
 
1er
OP
neku

neku

Codeur roumain


Sur le screen ci-dessus on peut observer le kernel démarrer et le debut du DUMP de la RAM



Sur celui-ci (plus bas dans le DUMP) on peut observer que notre noyau est bien chargé à l'adresse 0x1000 comme définit dans le boot sector ;)
 

Ahava

Revenant
Quel courage :eek:
 
1er
OP
neku

neku

Codeur roumain
Merci pour vos points de réputations négatifs, mais j'aimerais que lorsque vous le faites de justifier votre acte ...
Ci cela est une erreure de la part de la personne, merci d'équilibrer votre acte ;)
 

Actifed

236.443.443
T'inquiète, sûrement un frustré...

Voilà un petit coeur pour tout ton boulot.

C'est dément, j'y comprends rien de rien, le gros gros marasme :mrgreen:
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut