• STATISTIQUES
  • Il y a eu un total de 0 membres et 26424 visiteurs sur le site dans les dernières 24h pour un total de 26 424 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] SecurityFocus
    SecurityFocus a été conçu pour faciliter la discussion sur des sujets liés la sécu...
    Vulnérabilités
    [FR] Hackfest
    Le Hackfest est un évènement de sécurité et de piratage informatique au Québec reg...
    Hacking
    [EN] Hack this site
    Basic: 11, Realistic: 17, Application: 18, Programming: 12, Extbasic: 14, Javascript: 7, Stego: 17
    Challenges
    [EN] Lost-chall
    Site de challenge présenté sous la forme de différente saison. Pour passer une saison vous devez avoir accumulÃ...
    Challenges
    [EN] Defcon
    Lancé en 1992 par Dark Tangent, DEFCON est la plus ancienne et la plus grande conférence underground de...
    Hacking
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation
    [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!

    €



Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
BOOTSECTOR and BOOTLOADER
03-12-2013, 15h21 (Modification du message : 03-12-2013, 15h32 par gruik.)
Message : #1
EpicOut Hors ligne
Banni



Messages : 121
Sujets : 10
Points: 22
Inscription : Feb 2012
BOOTSECTOR and BOOTLOADER
Bon, je me lance, pour commencer un OS va falloir déjà nourrir le BIOS avec un secteur de boot, càd, un programma assemblé directement dans le jeu d'instruction de votre processeur, voici un article qui explique comment programmer et debugger un programme en raw (oui,oui c'est le nom qu'on donne au programme assemblé directement dans le jeu d'instruction de votre proco) http://www.nondot.org/sabre/os/files/Boo...mpiler.pdf (il le fait en C, mais nous c'est la méthode qui nous intéresse).

Voici comment votre ordinateur fonctionne de votre pression sur le bouton jusqu'à l'interface de votre système d'exploitation.
Pression sur le bouton reset-> le BIOS prends la main et effectue le POST, puis cherche le bootsector, il lit les 512 premiers octets ni plus ni moins, pour y trouver notre bootloader (qui sera notre programme assemblé/compilé en raw), le BIOS valide un bootloader si ses derniers octets sont 0x55,0xAA , dès lors que ces octects y sont, il copie en mémoire à l'adresse 0x7C00, puis il lui donne la main (en asm ça donnerait "JMP 7c00h")->le bootloader est loadé Smile et donc, il effectue son boulot puis charge le système d'exploitation.

Voici un exemple de bootloader pris sur le net que je vais vous détailler.:
Code ASM :

;******************* START ************************
; Boot sector authoring example by Gareth Owen (gaz@athene.co.uk)
; This should be accompanied with an article explaining bootsectors

[BITS 16]       ; On indique qu'on bosse en 16 bits (mode réel oblige)
[ORG 0]     ; Data offset = 0 pas besoin de traduire

jmp start       ; on passe notre "section" data, car la section data ne s'éxecute pas :-),
                ; well, you can, but i am not held responsible for the results

; -------------------------------------
; Data used in the boot-loading process
; ------------------------------------------------------------------------
        bootdrv         db 0
        bootmsg         db 'Gareth Owen',39,'s Boot Sector Example',13,10,0

        rebootmsg    db 'Press any key to reboot',13,10,0

        ; these are used in the processor identification
        processormsg    db 'Checking for 386+ processor: ',0
        need386         db 'Sorry... 386+ required!',13,10,0
        found386        db 'Found!',13,10,0

    whatever    db 'Insert your code to do something here',13,10,0

;*******************************************
; Functions we are going to use ...
;*******************************************
        detect_cpu: ;C'est une méthode spéciale, donc ça sert à rien que je vous explique le pourquoi du comment.
                mov si, processormsg    ; tell the user what we're doing
                call message

                ; test if 8088/8086 is present (flag bits 12-15 will be set)
                pushf                   ; save the flags original value
               
                xor ah,ah               ; ah = 0
                push ax                 ; copy ax into the flags
                popf                    ; with bits 12-15 clear
               
                pushf                   ; Read flags back into ax
                pop ax      
                and ah,0f0h             ; check if bits 12-15 are set
                cmp ah,0f0h
                je no386                ; no 386 detected (8088/8086 present)

                ; check for a 286 (bits 12-15 are clear)
                mov ah,0f0h             ; set bits 12-15
                push ax                 ; copy ax onto the flags
                popf
               
                pushf                   ; copy the flags into ax
                pop ax
                and ah,0f0h             ; check if bits 12-15 are clear
                jz no386                ; no 386 detected (80286 present)
                popf                    ; pop the original flags back
               
                mov si, found386
                call message
               
                ret                     ; no 8088/8086 or 286, so ateast 386
         no386:
                mov si,need386          ; tell the user the problem
                call message
                jmp reboot              ; and reboot when key pressed
                     
;       ********************************************************************
        message:                        ; Dump dsi to screen.
                lodsb                   ; load byte at dsi into al
                or al,al                ; on est à la fin de la chaine ?
                jz done
                mov ah,0eh              ; on met le caractère
                mov bx,0007             ; puis on attribue, n'hésitez pas à googler l'interruption 10/AH=0EH
                int 0x10                ; call BIOS
                jmp message
        done:
                ret
;       ********************************************************************
        getkey:
                mov ah, 0               ; wait for key
                int 016h
                ret

;       ********************************************************************
        reboot:
                mov si, rebootmsg       ; be polite, and say we're rebooting
                call message
                call getkey             ; and even wait for a key

                db 0EAh                 ; là, c'est un peu spécial, on écrit directement du langage machine pour rebooter, quand on jump à FFFF:0000 ça veut dire qu'on reboot, quand vous appuyez sur le bouton reset de votre ordinateur, bah enfait c'est comme si votre système jumper à cette adresse.

                dw 0000h ; c'est un dword, on le met à l'envers, j'ai expliqué pourquoi à la fin du code
                dw 0FFFFh
                ; no ret required; we're rebooting! (Hey, I just saved a byte
               
; *******************************************
; The actual code of our boot loading process
; *******************************************
start:
        mov ax,0x7c0    ;On met le registre de segment ds équivalent à 7c0h comme ça tout nos adresses seront relative à 07C00h
        mov ds,ax       ; On aurait pu mettre ORG [7c0h] aussi.
data

        mov [bootdrv], dl ; on garde le secteur de boot à portée de main, on sait jamais !

        cli             ; on met IF à 0, donc les interruptions de type IRQ ne seront pas traités
        mov ax,0x9000   ; On installe la pile
        mov ss,ax          ; Oui, on ne peut pas directement assigner ss à une valeur précise, donc on met ax comme intermédiaire
        mov sp,0xffff   ;
        sti             ; On remet IF à 1 pour re-traiter les prochaines interruptions

        mov si,bootmsg  ; display our startup message
        call message

        call detect_cpu ; on vérifie qu'on a un processeur x86

.386    ; on peut désormais utiliser le jeu d'instructions x86

        mov si,whatever  ; tell the user we're not doing anything interesting here
        call message
        call getkey
   
    call reboot

        times 510-($-$$) db 0 ; notre fichier ne fait pas 512 octects comme prévu donc on rempli le fichier de 00 jusqu au dernier bit
        dw 0xAA55 ; Quand on installe un dword, il sera toujours lu dans le sens contraire dont vous l'avez mis, donc mettez le à l'envers. C'est le 0x55 0xAA qui valide notre bootloader .
 
+1 (8) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut