SECTEUR BOOT, KERNEL ET CHARGEUR BOOT

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 4 avril 2005 à 13:00
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 - 1 avril 2007 à 09:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/30537-secteur-boot-kernel-et-chargeur-boot

ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
1 avril 2007 à 09:12
d'abord quand on fait "mov dx,msg" c'est LE POINTEUR de "msg" qui est mis dans "dx" (c'est parce que tu utilises nasm sinon tu devrais mettre "mov dx,Offset(Msg)")
infogerance Messages postés 2 Date d'inscription samedi 5 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
13 déc. 2005 à 23:04
Bonjour
je crois qu'on depasse le lecteur disquette...
je cherche un aide sur le chargement d'un kernel depuis un cd-rom ou un flash disk..
une solution simple et pas comme celle ci du isolinux qui simule le VTOC comme etant une racine root "/" pour chercher l'emplacement du kernel dans le cd. car celle ci vous oblige un repertoire isolinux est kernel zipé (bzimage). mercie.
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
11 avril 2005 à 19:15
http://www.ift.ulaval.ca/~dubois/ift17584/

voila je me suis lancer dans les recherches sur le Pmode et j'ai touvé des liens avec des cours interessants. Mais celui que j'ai le plus apprecié c'est celui ci. alors je le partage (si vous n'etes pas encore au courant de ce site).
Il y a meme un lien pour telecharger les 3 fameux docs d'intels.
Merci et à bientot.
HwW_Mb Messages postés 44 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 12 novembre 2005
6 avril 2005 à 17:30
Salut .
rappellons que le mode protégé est trés différent au mode réel !
le Rmode utilise la RAM comme suit 0000:0000 => FFFF:FFFF (1 mb de ram)
lui le Pmode l'utilise comme ca 0000:00000000 => FFFF:FFFFFFFF (4 go de ram !)
ici tu peux pas appeller les Ints car c impossible !!!
la table de vecteur d'interruptions est compatible 16 bit ! aussi les port comme a dit MrNop (xxxx:xxxx)
tu peux utiliser les Interrupteurs
et faire tes persos routines en rebasculons le processeur (v86) .
voici un exemple trés simple pour passer en mode protégé correctement en chargent un simple noyau
... ici au lieu d'utiliser les Ints il va utiliser la RAM directement (les adresses phisyque d'un périphérique en mémoire) !! ca sera plus rapide qu'un pauvre int :)
http://inferno.cs.univ-paris8.fr/~am/tutorial/os/tutorial04.html
---------------------------------------------------------------
Bon Courage sajaris |-^_^-|
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
6 avril 2005 à 13:21
merci patatalo. le mode v86 je savais pas, avant que MrNOP ne m'en parle.
je vais voir bootcom.....
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
6 avril 2005 à 12:52
re,

effectivement, si tu passe en mode protégé, les interruptions doivent etre réécrite ou desactivées.

le bootcom est un exemple, tu pourras voir qu'il est assez simple de réecrire les interruptions au moins pour qu'elle ne fasse rien ou un minimum.

je l'ai fais en format .com, tu le met sur une D7 boot dos et tu le lance directement de la D7. Ca evite d'utiliser un mkboot

http://www.asmfr.com/code.aspx?ID=26997

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
6 avril 2005 à 12:44
salut,

a mon avis basculer du mode protégé au mode réel est valable pour l'époque du 286 mais le mode v86 est beaucoup plus interessant a utiliser et permet en plus de mettre le bios sous surveillance.

Il est de + possible de generer plusieurs taches v86 en meme temps.

Hook des instructions int, cli, sti, iret, ...

@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
6 avril 2005 à 12:11
je demande aussi l'avis de patatalo et HwW_Mb.
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
6 avril 2005 à 11:58
MrNOP>Si tu veux plus de mémoire tu peux utiliser le Flat real mode (unreal mode) qui permet d'etendre l'accés a la mémoire etendue complete (<4Gb) sans etre en mode protegé. Il suffit pour cela de basculer en mode protege, utiliser pour un selecteur un descripteur dont la limite est de 4Gb et revenir en mode réel !<

c'est tout ce qu'il faut faire pour avoir plus de memoire? et apres avoir basculé en mode reel, j'ai maintenant 4Go si je comprends bien. Ok, je vais l'essayer. Mais pour un essaie je vais pas directement utiliser les ports comme tu me le conseil, mais les int BIOS que j'espere vont fonctionner toujours.

Surtout merci pour les sites.

je comprends maintenant pourquoi tu parle de conversion LBA->CHS si j'utilise un disque. Mais pour l'instant j'utilise une disquette.

mais le Pmode , ca m'interesse vraiment maintenant. Tu as des exemples à compiler avec nasm STP?
ce que j'ai deja réalisé c'est l'initailisation du gdt, le passage en Pmode. puis je lance la lecture sur la disquette du noyau(sur deux secteurs) que je charge en memoire avec des int BIOS. mais a partir de la plantage direct ( le lecteur de disquette reste constamment allumé et plus rien). selon moi, je dois sois reecrire les int, car celles du BIOS ne marche plus en Pmode, sois revenir en Rmode ( et la je sais plus si j'ai 4Go de memoire). qu'en pense tu?
(je vais chercher aussi le unreal mode.)
MrNOP Messages postés 17 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 1 février 2006
5 avril 2005 à 19:47
pour les entrées sorties :
http://cos2000.perso.cegetel.net/int.rar
http://cos2000.perso.cegetel.net/int2.rar

sinon concernant LBA CHS .( LBA concerne que les disque dur donc je parlerais ici d'adressage lineaire d'un secteur )

voila en fait dans un OS on ne raisonne pas en haut nivo avec le N°cylindre (ou piste pour disquette), N° tete, N° secteur (d'ou l'appellation CHS, cylinder, head, sector). Lorsque tu utilise le BIOS avec une disquette c moins grave parce lui parle en CHS et que tu connais parfaitement la geometrie de la disquette (80 pistes,18 secteurs, 2 tetes). Mais sur un disque c plus delicat, il te faut donc recuperer ses infos du BPB (expliqué plus haut) et créer une routine qui transforme un n° secteur lineaire en coordonnées CHS. Regarde ta disquette a en tous 80*18*2 secteurs physique de 512 octets ce qui rend adressable 2880 secteur, en raisonnant avec un nombre entre 0 et 2880 pour situé un secteur c plus simple que d'utiliser les coordonnées CHS.
adressage lineaire piste tete secteur
exemple secteur 0 -> 0 0 1
secteur 12h -> 0 0 12h
secteur 2Ch -> 1 0 9h

pour plus infos ->
http://membres.lycos.fr/cos2000/FS.html
http://membres.lycos.fr/cos2000/disquette.html

De toute façon c un passage obligé pour la lecture d'une fat !!!

Voila
Sinon le switch mode reel-mode protege qui est utilisé par les dos extenders par exemple, et il est relativement lent !!!!
Arf je sais pas pkoi les gens n'aiment pas le mode réel !!!
Si tu veux plus de mémoire tu peux utiliser le Flat real mode (unreal mode) qui permet d'etendre l'accés a la mémoire etendue complete (<4Gb) sans etre en mode protegé. Il suffit pour cela de basculer en mode protege, utiliser pour un selecteur un descripteur dont la limite est de 4Gb et revenir en mode réel !
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
5 avril 2005 à 19:09
ah ok, tu me conseil les ports, dons j'oublie les int. c'est cela? (si oui ou puije trouver la liste des ports entrée sortie?)

je comprend pas "conversion LBA->CHS ".

MrNOP>
Pour l'appel d'int bios en mode protegé il existe :
- le passage en mode réel le temps de l'appel de l'int et rebasculer en mode protégé

je voudrai savoir si cette technique n'est pas lente...
et le mode v86 ? ca je vais chercher.

merci encore
MrNOP Messages postés 17 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 1 février 2006
5 avril 2005 à 18:49
Re,

En fait dans cette boucle il faut que tu insere une sous routine qui fait la conversion LBA->CHS a la place de l'appel de l'int 13h

Concernant l'appel de fonction bios en mode protegé, il est possible de le faire mais infiniment plus simple d'implémenter un accés au lecteur disquette, video et HD par les entrées/sorties.

Pour l'appel d'int bios en mode protegé il existe :

- le passage en mode réel le temps de l'appel de l'int et rebasculer en mode protégé
- Un pseudo mode V86

J'ai deja codé une partie d'OS en Pmode mais en C c'est bcp moins sportif comme défit lol
D'autre part meme pour le mode réel je te deconseille d'utiliser le BIOS (lenteur) !!
Surtout en ce qui concerne la video, tu peux programmer trés simplement la vga ou le vesa en utilisant que les ports d'entrée sortie !
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
5 avril 2005 à 18:10
merci HwW_Mb. c'est surtout en voyant et en exploitant votre OS que j'ai essaé de comprendre le fonctionnement, et pour cela essayé d'en faire un.

Pour ce qui est du mode protégé, je voudrai bien, mais c'est compliqué, mais pas impossible ;)
il faudrait initialiser le gdt, definir les descripteurs....
Ce que je comprends pas, quand je bascule en mode protégé, est-ce que les int bios sont encore valides? je pense qu'il faudrait reecrire les interruptions en initialisant l'idt et utiliser ses propres interruptions. c'est exacte?

LordBob> en fait si tu remarque dans mon programme, je n'ai pas utilisé d'interruption dos (int 21h....). Parce que Dos est un OS. Au demarrage du PC, tu n'a que le BIOS qui teste les périphériques, cherche un MBR ensuite le charge et lui donne la main. Il n'ya donc aucun probleme si j'utilise les int bios, mais pas dos, là tu aurai raison.

MrNOP> dans ta version simplifiée tu ne fait plus de boucle pour charger les secteurs. Donc j'avais raison en disant qu'il le fait automatiquement, ou c'est un oubli?
HwW_Mb Messages postés 44 Date d'inscription jeudi 3 juin 2004 Statut Membre Dernière intervention 12 novembre 2005
5 avril 2005 à 04:21
ouais , bon boulot sajaris
c bien pour un début ;) mais essaye de faire une amélioration : faire un petit shell, des commandes utils
ect ....
ensuite bascule toi en mode protégé ;)
LordBob: chaque Os a besoin d'appeller ces Ints en mode réel pour charger le kernel en mode 32 bits :)
...............................

Bonne Continuation sajaris |-^_^-|
MrNOP Messages postés 17 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 1 février 2006
4 avril 2005 à 21:45
ça c une version simplifiée !!!!

nb_sector equ 9

push es
mov ax,0100h
mov es,ax
xor bx,bx ;mieux que mov bx,0h prend moins de place
mov cx,0002h ;premier secteur a charger sur piste 0
xor dx,dx
mov ah,02
mov al,nb_sector
int 13h
pop es

LordBob> un os utilise tjr le bios (interruption logicielles) pour se charger au boot du PC car aucun OS n'est chargé et il est impossible d'implémenter en un secteur de boot un pilote de disquette (DMA+fdd).
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
4 avril 2005 à 20:30
alors il me semble, mais corrige moi si je me trompe, que les interruptions "dépende" d'un OS... or pour un chargeur de boot, il me semble qu'il faudrait qu'il soit plutot "independant" !
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
4 avril 2005 à 20:17
merci pour vos suggestion je vais revoir le code et l'ameliorer.

Mais je savais pas qu'il fallais une boucle pour qu'il puisse charger plusieurs secteurs. Je pensais qu'il le faisait automatiquement. je vais prendre cela en compte.


LordBob dit:
"salut, je ne m'y connais pas beaucoup en assembleur, mais quand je vois que ton code contient des interruptions, j'ai bie peur que ca parte mal !"

je comprends pas bien pourquoi tu dis cela, les interruptions bios que j'utilise fonctionne bien et ca plante pas du tout.
MrNOP Messages postés 17 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 1 février 2006
4 avril 2005 à 19:09
Salut,

Pour que tu puisse charger plus d'un secteur en mémoire, il faut que tu fasse une boucle autour de ton int 13h func 2.

exemple repris de ton code:

nb_sector equ 9
sector_size equ 512
push es
mov ax,0100h
mov es,ax
xor bx,bx ;mieux que mov bx,0h prend moins de place
mov si,nb_sector ;nombre de secteurs a charger
mov cx,0002h ;premier secteur a charger sur piste 0
xor dx,dx
loading_sectors:
mov ax,0201h
int 13h
jc error_loading
add bx,sector_size
inc cl
dec si
jnz loading_sectors
end_loading:
pop es

error_loading:
TU MET TA GESTION D'ERREUR

l'inconvenient de ton secteur de boot c qu'il ne respecte pas la norme !! Pas de BPB (boot parameter block) et de plus il te faut une routine de conversion LBA->CHS pour pouvoir charger un nombre plus important de secteurs car la solution que j'ai ecrite ne charge que 18 secteurs au maximum.

Cf http://membres.lycos.fr/cos2000/ mon ancien site dans la section tutorial OS
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
4 avril 2005 à 13:13
salut, je ne m'y connais pas beaucoup en assembleur, mais quand je vois que ton code contient des interruptions, j'ai bie peur que ca parte mal !
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
4 avril 2005 à 13:00
salut,

la gestion d'un kernel > 512 octets est à prévoir rapidement ;-)

@++
Rejoignez-nous