[Asm] Mon système d'exploitation

Discussion dans 'Web, design' créé par neku, 5 Octobre 2006.

Statut de la discussion:
Fermée.
  1. Offline
    Gegurion Casse Couille
    Franchement, je comprends rien a tout ça, mais je te souhaite bon courage, et surtout bonne merde ! :-D
    Gegurion, 6 Octobre 2006
    #21
  2. Offline
    Gatchan77 Met Romana op de scooter
    ça faisait longtemps que j'avais plus vu du code ASM. Ce truc de barbare ... :=)
    Gatchan77, 6 Octobre 2006
    #22
  3. Offline
    Froggy fake geek
    tiens au fait ... quels sont les services que doit fournir un kernel ? :)
    Froggy, 6 Octobre 2006
    #23
  4. Offline
    Ezekiel ! Elite
    et quoi l'anti cheat il en est ou :p ?
    Ezekiel !, 7 Octobre 2006
    #24
  5. Offline
    PunkDeLuxe condom
    Si tu es sur Bruxelles, te conseillerais de te procurer les cours de l'ESI en Operating System :p

    Bonne merte quand mm :p
    PunkDeLuxe, 7 Octobre 2006
    #25
  6. Offline
    Dieu Bisounours a.k.a FFS
    Pour en faire du papier toilette?
    Dieu Bisounours, 9 Octobre 2006
    #26
  7. Offline
    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 ;)
    neku, 10 Octobre 2006
    #27
  8. Offline
    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 !
    Sedeete, 10 Octobre 2006
    #28
  9. Offline
    the_quent1 Elite
    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 :p lool)
    the_quent1, 10 Octobre 2006
    #29
  10. Offline
    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.
    neku, 10 Octobre 2006
    #30
  11. Offline
    paf_ rider // gsxr600 k5
    Et bien ... comment dire ... bonne merde :-9

    Tu prédit la sortie de la beta quand ça ?
    paf_, 10 Octobre 2006
    #31
  12. Offline
    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)
    Gatchan77, 10 Octobre 2006
    #32
  13. Offline
    neku Codeur roumain
    Voici un petit screenshot du résultat actuel

    [IMG]
    neku, 10 Octobre 2006
    #33
  14. Offline
    PunkDeLuxe condom
    Comme documentation ;) ... enfin ca tu dois p-e pas comprendre non plus :?

    Et sinon bah chapeau :p j'attend de voir ce que ca donne
    PunkDeLuxe, 10 Octobre 2006
    #34
  15. Offline
    Groszours Elite
    Ca a l'air prometteur ! :=)

    Si tu cherches des betas testeurs lambda fait moi signe! =]
    Groszours, 10 Octobre 2006
    #35
  16. Offline
    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
    neku, 11 Octobre 2006
    #36
  17. Offline
    neku Codeur roumain
    [IMG]

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

    [IMG]

    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 ;)
    neku, 11 Octobre 2006
    #37
  18. Offline
    Ahava Revenant
    Quel courage :eek:
    Ahava, 11 Octobre 2006
    #38
  19. Offline
    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 ;)
    neku, 11 Octobre 2006
    #39
  20. Offline
    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 :D
    Actifed, 11 Octobre 2006
    #40
Statut de la discussion:
Fermée.