feat: ajout des fonctions de debug par GDB

This commit is contained in:
Nicolas Hordé 2019-07-13 13:33:26 +02:00
parent 53b445a652
commit 2a7798dfd3
5 changed files with 220 additions and 188 deletions

View File

@ -7,199 +7,216 @@ include "..\include\divers.h"
org 7C00h org 7C00h
jmp boot jmp Boot
bootsec bootinfo "COS2000A","COS2000 ","FAT12 " bootsec bootinfo "COS2000A","COS2000 ","FAT12 "
errorloading db " [Erreur]",0dh,0ah,0 Boot_Message db "Cos2000",0
okloading db "Recherche noyau ",0Dh,0ah," -" Entre_Message db "Search",0
sys db "SYSTEME SYS",0 Loading_Message db "Load",0
syst db " [ Ok ]",0dh,0ah,"Chargement ",0 System_File db "As",0,"y",0,"s",0,"t",0,"e",0,0x0F,0,0x38,"m",0,"e",0,".",0,"s",0,"y",0,"s",0,0,0,0,0,0xFF,0xFF
dot db ".",0 Is_Ok db " [ OK ]",0x0A,0x0D,0
Is_Failed db " [ERROR]",0x0A,0x0D,0
The_Dot db '.',0
errorboot: Boot_Error:
mov si,errorloading mov si,Is_Failed
call showstr call ShowString
mov ah,0 xor ax,ax
int 16h int 0x16
int 19h int 0x19
boot: Boot_Ok:
mov [bootsec.bootdrive],dl mov si,Is_Ok
cli call ShowString
mov ax,09000h ret
mov ss,ax
mov sp,0FFFFh Boot:
sti push cs
boot2: push cs
push cs pop es
push cs pop ds
pop es mov [bootsec.bootdrive],dl
pop ds cli
xor ax,ax mov ax,0x9000
mov dl,[bootsec.bootdrive] mov ss,ax
int 13h mov sp,0xFFFF
jc errorboot sti
mov si,okloading mov si,Boot_Message
call showstr call ShowString
mov cx,[bootsec.reservedsectors] xor ax,ax
add cx,[bootsec.hiddensectorsh] int 0x13
adc cx,[bootsec.hiddensectorsl] jc Boot_Error
push cx mov cx,[bootsec.reservedsectors]
mov bx,[bootsec.sectorsperfat] add cx,[bootsec.hiddensectorsh]
mov di,bufferfat adc cx,[bootsec.hiddensectorsl]
mov bx,[bootsec.sectorsperfat]
mov di,bufferfat
push bx
push cx
readfat: readfat:
call readsector call ReadSector
jc errorboot jc Boot_Error
inc cx inc cx
add di,[bootsec.sectorsize] add di,[bootsec.sectorsize]
dec bx dec bx
jnz readfat jnz readfat
pop cx pop cx
xor ax,ax pop bx
mov al,[bootsec.fatsperdrive] xor ax,ax
mov bx,[bootsec.sectorsperfat] mov al,[bootsec.fatsperdrive]
mul bx mul bx
add cx,ax add cx,ax
mov ax,32 mov ax,32
mul [bootsec.directorysize] mul word [bootsec.directorysize]
div [bootsec.sectorsize] div word [bootsec.sectorsize]
add ax,cx add ax,cx
sub ax,2 sub ax,2
mov word [bootsec.reservedfornt],ax mov word [bootsec.reservedfornt],ax
xor dx,dx xor dx,dx
checkroot: call Boot_Ok
mov di,buffer mov si,Loading_Message
call readsector call ShowString
jc errorboot Find_System:
xor bx,bx mov di,buffer
findnext: call ReadSector
cmp byte [di],0 jc Near Boot_Error
je errorboot xor bx,bx
cmp byte [di],0E5h Next_Root_Entrie:
je no cmp byte [di],0
cmp byte [di],041h je near Boot_Error
je no push di
mov si,dot push cx
call showstr mov si,System_File
push di cx mov cx,32
mov si,sys rep cmpsb
mov cx,11 pop cx
rep cmpsb pop di
pop cx di je System_Found
je oksystem add di,32
no: add bx,32
add di,32 inc dx
add bx,32 cmp dx,[bootsec.directorysize]
inc dx ja near Boot_Error
cmp dx,[bootsec.directorysize] cmp bx,[bootsec.sectorsize]
ja errorboot jb Next_Root_Entrie
cmp bx,[bootsec.sectorsize] inc cx
jb findnext jmp Find_System
inc cx System_Found:
jmp checkroot call Boot_Ok
oksystem: mov si,Entre_Message
mov si,syst call ShowString
call showstr mov cx,[di+26+32]
mov cx,[di+26] mov ax,0x8000
mov ax,8000h mov es,ax
mov es,ax push es
push es mov di,0x0
mov di,0000h push 0x10
push 0010h mov si,The_Dot
mov si,dot Resume_Loading:
xor ax,ax cmp cx,0x0FF0
fatagain: jae Finish_Loading
cmp cx,0FF0h push cx
jae finishload add cx,word [bootsec.reservedfornt]
push cx call ReadSector
add cx,word [bootsec.reservedfornt] pop cx
call readsector jc near Boot_Error
pop cx call ShowString
jc errorboot add di,[bootsec.sectorsize]
inc ax call NextFatGroup
call showstr jc near Boot_Error
add di,[bootsec.sectorsize] jmp Resume_Loading
call getfat Finish_Loading:
jnc fatagain call Boot_Ok
finishload: retf
retf
;=============READSECTOR (Fonction 01H)=============== ;====================READSECTOR=======================
;Lit le secteur CX et le met en es:di ;Lit le secteur logique LBA CX et le met en es:di
;-> AH=1 ;-> CX (limité à 65536 secteurs, soit 32 Mo avec secteur 512 octets)
;<- Flag Carry si erreur ;<- Flag Carry si erreur
;===================================================== ;=====================================================
readsector: ReadSector:
push ax bx cx dx si pusha
mov ax,cx mov ax,cx
xor dx,dx xor dx,dx
div [bootsec.sectorspertrack] div word [bootsec.sectorspertrack]
inc dl inc dl
mov bl,dl mov bl,dl
xor dx,dx xor dx,dx
div [bootsec.headsperdrive] div word [bootsec.headsperdrive]
xchg dl,dh mov dh, [bootsec.bootdrive]
mov cx,ax xchg dl,dh
xchg cl,ch mov cx,ax
shl cl,6 xchg cl,ch
or cl, bl shl cl,6
mov bx,di or cl, bl
mov si, 4 mov bx,di
mov al, 1 mov si, 4
tryagain: mov al, 1
mov ah, 2 Read_Again:
mov dl,[bootsec.bootdrive] mov ah, 2
int 13h int 0x13
jnc done jnc Read_Done
dec si dec si
jnz tryagain jnz Read_Again
done: Read_Done:
pop si dx cx bx ax popa
ret
getfat:
push ax bx dx di
mov di,bufferfat
mov ax,cx
mov bx,ax
and bx,0000000000000001b
shr ax,1
mov cx,3
mul cx
add di,ax
cmp bx,0h
jnz evenfat
oddfat:
mov dx,[di]
and dx,0FFFh
mov cx,dx
jmp endfat
evenfat:
mov dx,[di+1]
and dx,0FFF0h
shr dx,4
mov cx,dx
endfat:
pop di dx bx ax
ret ret
showstr: ;===================NEXTFATGROUP======================
push ax bx si ;Renvoie en CX le groupe qui succède dans la FAT le groupe CX
again: ;-> CX
;<-
;=====================================================
NextFatGroup:
push bx
push dx
push di
mov ax,cx
mov bx,ax
and bx,0000000000000001b
shr ax,1
mov cx,3
mul cx
mov di,bufferfat
add di,ax
cmp bx,0
jnz Even_Group
Odd_Group:
mov dx,[di]
and dx,0x0FFF
mov cx,dx
jmp Next_Group_Found
Even_Group:
mov dx,[di+1]
and dx,0xFFF0
shr dx,4
mov cx,dx
Next_Group_Found:
pop di
pop dx
pop bx
ret
;======================SHOWSTR========================
;Affiche la chaine de caractère pointé par ds:si à l'écran
;-> DS, SI
;<- Flag Carry si erreur
;=====================================================
ShowString:
pusha
Next_Char:
lodsb lodsb
or al,al or al,al
jz fin jz End_Show
mov ah,0Eh mov ah,0x0E
mov bx,07h mov bx,0x07
int 10h int 0x10
jmp again jmp Next_Char
fin: End_Show:
pop si bx ax popa
ret ret
rb 7C00h+512-2-$ rb 7C00h+512-2-$
db 055h,0AAh db 055h,0AAh
@ -209,4 +226,3 @@ buffer:
rb 7C00h+512+2048-$ rb 7C00h+512+2048-$
bufferfat: bufferfat:
rb 7C00h+512+4096-$ rb 7C00h+512+4096-$

8
debug/boot.txt Normal file
View File

@ -0,0 +1,8 @@
target remote localhost:1234
set disassembly-flavor intel
set architecture i8086
display/20i $pc+$cs*16
break *0x7c00
cont
clear *0x7c00

9
debug/system.txt Normal file
View File

@ -0,0 +1,9 @@
target remote localhost:1234
set disassembly-flavor intel
set architecture i386
display/20i $pc+$cs*16
break *0x80010
cont
clear *0x80010

View File

@ -3,14 +3,13 @@ all: cos2000.img
cos2000.img: cos2000.img:
(dd if=/dev/zero of=cos2000.img count=2880 bs=512) (dd if=/dev/zero of=cos2000.img count=2880 bs=512)
(mkfs.msdos -F 12 -n "COS2000" cos2000.img) (mkfs.msdos -F 12 -n "COS2000" cos2000.img)
(fusefat cos2000.img ./mnt -o rw+) (fusermount ./mnt -u;mkdir -p ./mnt;rm -rf ./mnt/*;fusefat cos2000.img ./mnt -o rw+)
(cp ../noyau/systeme.sys ./mnt/) (cp ../noyau/systeme.sys ./mnt/)
(cp ../noyau/systeme.ini ./mnt/) (cp ../noyau/systeme.ini ./mnt/)
(cp ../programs/*.ce ./mnt/) (cp ../programs/*.ce ./mnt/)
(cp ../programs/*.lib ./mnt/)
(cp ../programs/*.rip ./mnt/) (cp ../programs/*.rip ./mnt/)
(cp ../lib/*.lib ./mnt/) (cp ../lib/*.lib ./mnt/)
(cp ../system/system.sys ./mnt/;sync) (sync)
(fusermount ./mnt -u) (fusermount ./mnt -u)
(dd if=../boot/boot12.bin of=cos2000.img seek=0 count=1 conv=notrunc;sync) (dd if=../boot/boot12.bin of=cos2000.img seek=0 count=1 conv=notrunc;sync)

View File

@ -20,15 +20,15 @@ copy:
test: all copy qemu test: all copy qemu
view: view: final/cos2000.img
(hexdump -C ./final/cos2000.img|head -c10000) (hexdump -C ./final/cos2000.img|head -c10000)
view2: boot/boot12.bin
(objdump -D -b binary -mi386 -Maddr16,data16 ./boot/boot12.bin)
debug-boot: all copy qemu-debug debug-boot: all copy qemu-debug
(sleep 2;cgdb -x ./debug/boot.txt) (sleep 2;cgdb -x ./debug/boot.txt)
debug-loader: all copy qemu-debug
(sleep 2;cgdb -x ./debug/loader.txt)
debug-system: all copy qemu-debug debug-system: all copy qemu-debug
(sleep 2;cgdb -x ./debug/system.txt) (sleep 2;cgdb -x ./debug/system.txt)