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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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,
Partager