Bonjour,
J'ai un souci en suivant le tuto pepin os, je voulais faire en sorte que la partie du kernel generant la gdt soit en assembleur, et j'ai un pépin :D
J'ai fait ca comme code :
j'ai utilisé qemu (je n'ai rien compris à bochs) Et quand je teste j'ai un reboot en boucle (je vois le message kernel loading et ensuite ca reboot)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 _start: call init_screen mov eax, loading_msg push eax call aff_msg pop eax mov ax, gdtend ;on se met à la fin de la gdt mov bx, gdt ;on se met au debut de la gdt sub ax, bx ;on calcul la difference de taille entre les deux mov word[gdtptr], ax ;on stocke cette difference dans gdtptr 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 lgdt [gdtptr] ;on reinitialise les selecteurs de donnees mov ax, 0x10 ;emplacement du datasegment mov ds, ax ;met le datasegment à 0x10 mov es, ax ;met l'extra segment à 0x10 mov fs, ax ;fs = adresse extra segment en mode protege mov gs, ax ;gs = adresse extra segment en mode protege ;on reinitialise la stack mov ax, 0x18 mov ss, ax ;met la stack à 0x18 mov esp, 0x20000 ;indique la fin de la stack jmp dword 0x8:next ; on reinitialise le selecteur de code next: mov eax, loaded_msg push eax call aff_msg pop eax end: jmp end loading_msg: db "Loading GDT", 0xA, 0xD, 0x0 loaded_msg: db "GDT loaded", 0xA, 0xD, 0x0 gdt: db 0, 0, 0, 0, 0, 0, 0, 0 ;descripteur du segment NULL gdt_cs: db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10011011b, 11011111b, 0x0 ;descripteur du segment de code gdt_ds: db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10010011b, 11011111b, 0x0 ;descripteur du segment de donnees gdt_ss: db 0x0, 0x0, 0x0, 0x0, 0x0, 10010111b, 11010000b, 0x0 ;descripteur du segment de pile gdtend: ;on a fini de decrire le tableau de descripteurs gdtptr: dw 0 ;limite de la gdt dd 0 ;base de la gdt
Je pense que sa vient de ma gdt qui n'est pas correct mais je n'arrive pas à savoir ou, ou alors du shl (je sais que c'est un decalage de bits vers la gauche mais je n'ai pas compris à quoi il servait)
Si vous pouviez m'aider ce serait vraiment sympa,
Cordialement,