Bonsoir , svp , pour ne pas oublié ce que j'ai vu , pourrais-je avoir les exercices ou les projets concernant la conception des systèmes d'exploitation??
Merci...
Bonsoir , svp , pour ne pas oublié ce que j'ai vu , pourrais-je avoir les exercices ou les projets concernant la conception des systèmes d'exploitation??
Merci...
Salut , désolé pour le dérangement ....
En fait je suis encore bloqué sur un module concernant la gdt , ...
J'ai bien compris le principe , mais au niveau du code , je ne comprends pas grand chose....
Quelqu'un pourra t-il m'aider sur le code , la parite où se trouve :l'initialisation du poiteur de la GDT??
....merci
Bonjour Mr , j'ai compris sagement votre cours sur comment concevoir son propre noyau.
Cependant , j'ai un souci sur la partie : "Ecrire un noyau en c"
En suivant votre principe de compilation , je me suis rendu compte que la compilation de votre cour se fait sur une architecture 32 bits , mais le mien est sur 64 bits... donc mes compilations à partir de ce niveau se déroule avec plusieurs échecs .
S'il vous plaît Mr , pourrez vous m'aidez ou me donner des indices pour que je puisse continuer votre cour ?
Merci
Un processeur 64 bits peut exécuter du code 32 bits.
Pour la compilation, un compilateur 64 bits génèrera du code 64 bits, mais pourra générer du 32 bits si on lui demande.
Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
Mon article sur le P2V, mon article sur le cloud
Consultez nos FAQ : Windows, Linux, Virtualisation
Salut tout le monde , j'ai un probleme au niveau de la sortie du message dans la mémoire video :
Je vous laisse admirez le code :
Code pour le secteur boot :
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 %define BASE_KERNEL 0x100 ;base du noyau %define KERNEL_SIZE_DRIVER 100 ;nombre de secteur à lire pour charger le noyau bits 16 org 0x0000 jmp start_bootsector %include "print_bootsector.INC" %include "load_kernel.INC" start_bootsector : mov ax, 0x07c0 cli mov ds, ax mov es , ax mov ax , 0x0000 mov ss , ax mov sp , 0xf000 sti mov si, msg_boot call print_boot mov si , msg_kernel call print_boot mov [bootdrv] , dl call get_status_drive ; initialisation du pointeur sur la GDT mov ax, gdtend ; calcule la limite de GDT mov bx, gdt sub ax, bx mov word [gdtptr], ax xor eax, eax ; calcule l'adresse lineaire de GDT 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 modep cli lgdt [gdtptr] ; charge la gdt mov eax, cr0 or ax, 1 mov cr0, eax ; PE mis a 1 (CR0) jmp next next: mov ax, 0x10 ; segment de donne mov ds, ax mov fs, ax mov gs, ax mov es, ax mov ss, ax mov esp, 0x9F000 jmp dword 0x8:0x1000 ; reinitialise le segment de code msg_boot db 10,'Chargement du boot sans aucune verification' , 13 , 10 , 0 msg_kernel db 'Chargement du noyau sans aucune verification' ,13 ,10,0 bootdrv : db 0 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 ; limite dd 0 ; base ;-------------------------------------------------------------------- times 510-($-$$) db 0 db 0x55 db 0xAA
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 ;charger le secteur de kernel en memoire get_status_drive : xor ax , ax int 0x13 load_kernel : push es mov ax , BASE_KERNEL mov es , ax mov bx , 0 mov ah , 2 mov al , KERNEL_SIZE_DRIVER mov ch , 0 mov cl , 2 mov dh , 0 mov dl , [bootdrv] int 0x13 pop es ret
Bon à ce niveau , je ne vois aucun problème .
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 cld print_boot : push ax push bx aff : lodsb cmp al , 0; zero=end or str jz exit_print_boot ; get out mov ah, 0x0E mov bh, 0 mov bl , 0x0001 int 0x10 jmp aff exit_print_boot : pop bx pop ax ret
Maintenant , j'ai un certains cas :
le cas ou j'écris sur la mémoire vidéo , tout ce passe bien , je donne un exemple :
l'autre cas , est au niveau du fait que je decide d'écrire dans la mémoire video en c :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 bits 32 mov byte [0xb8000] , 'H' mov byte [0xb8001] , 0x57 end : jmp end msg db 'premier message de chargement',13,10,0
on va l'appeler screen.c
Code C : 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 #include "types.h" static int kx = 0 ; static u8 *container ; static inline putchar(u8 c) { container = (u8*)0xb8000 ; container[kx] = c ; conainer[kx+1] = 0x57 ; kx +=2 ; } void print(char *s) { while(*s != 0) { putchar(*s) ;s++ ; } }
types.h :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #ifndef _I386_TYPE_ #define _I386_TYPE_ typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned char uchar; #endif
Maintenant regardons le kernel :
kernel.asm :
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 bits 32 extern print global _start _start : mov eax, msg push eax call print pop eax end : jmp end msg db 'premier message de chargement',13,10,0
Maintenant je lance le code shell pour les compilations :
Sur ce deuxième cas , rien ne s'affiche , je ne sais pas pourquoi .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 gcc -m32 screen.c -o screen.o nasm -f elf32 -o kernel.o kernel.asm ld -m elf_i386 -Ttext 1000 kernel.o screen.o -o kernel nasm -f bin -o boot boot.asm cat boot kernel /dev/zero | dd of=floppyA bs=512 count=2880
Qulequ'un pourra m'aider ??
Un GRAND merci à Michelizza pour ce magnifique tutorial !
Depuis un bon moment, je m'intéresse au fonctionnement du mode protégé du microprocesseur, et de la manière dont sont gérés les accès à la mémoire, les privilèges et compagnie. Et là, je tombe sur ce tuto... J'ai commencé à le lire, et dès le début, c'est passionnant !
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager