begin process at 2010 02 09 14:05:41
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Systeme

 > TORITO LOADER & ISOEMUL

TORITO LOADER & ISOEMUL


 Information sur la source

Note :
Aucune note
Catégorie :Systeme Classé sous :boot, torito, iso, cd, mbr Niveau :Initié Date de création :06/01/2006 Date de mise à jour :21/05/2008 17:19:18 Vu / téléchargé :7 099 / 392

Auteur : patatalo

Ecrire un message privé
Commentaire sur cette source (37)
Ajouter un commentaire et/ou une note

 Description

il y a 2 sources distinctes assemblées pour obtenir une image ISO bootable.

tomiso.asm simule une structure iso de cd. ( seul les information de Type LSB sont indiquées )

torito.asm est un code mbr qui utilise les fonction etendues de l'interruption 13h ( fct 41h,42h )et la structure DEVICE ADDRESS PACKET ( cf ATAPI )

le tout permet de booter et de charger un loader de + de 500Ko

codé a l'aide de nasm.

il etait fait dans le but de le passer dans VMWare mais VMWare plante a l'execution du bootcom :-(
il est tj possible de graver le cd et de demarrer avec.

eprom.com est simplement le binaire du bootcom. ( source fournie sur ce site )
il y a juste une modification de mise a jour de la pile en entrée du bootcom etant donné que le code torito
ne permet pas d'avoir cs=ss=ds=es

personne ne sent venir le LiveCD ?


 Conclusion

merci a www.t13.org

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   torito
    •   boot
    •   inc
      • 8259.incTélécharger ce fichier [Réservé aux membres club]276 octets
      • conio.incTélécharger ce fichier [Réservé aux membres club]405 octets
      • cpu.macTélécharger ce fichier [Réservé aux membres club]1 862 octets
      • desc.incTélécharger ce fichier [Réservé aux membres club]645 octets
      • iso9660.incTélécharger ce fichier [Réservé aux membres club]7 543 octets
      • keyb.incTélécharger ce fichier [Réservé aux membres club]2 407 octets
      • ldr32.incTélécharger ce fichier [Réservé aux membres club]308 octets
      • macros.macTélécharger ce fichier [Réservé aux membres club]935 octets
      • mm.incTélécharger ce fichier [Réservé aux membres club]3 043 octets
      • stdlib.incTélécharger ce fichier [Réservé aux membres club]574 octets
      • task.incTélécharger ce fichier [Réservé aux membres club]1 768 octets
      • tomsegs.incTélécharger ce fichier [Réservé aux membres club]261 octets
    •   ldr
    •   support
    • build.batTélécharger ce fichier [Réservé aux membres club]Voir ce fichier208 octets
    • tomiso.isoTélécharger ce fichier [Réservé aux membres club]65 536 octets
    • tomldrTélécharger ce fichier [Réservé aux membres club]16 384 octets
    • torito.bifTélécharger ce fichier [Réservé aux membres club]2 048 octets

Télécharger le zip


 Historique

11 janvier 2006 08:55:52 :
le 10/01/2006 -- torito.asm *ajout de la fonctionnalité "Appuyez sur une touche pour démarrer du CD-ROM" hook int 1Ch *xint13 devait avoir ds = ss, c'est maintenant inclu dans la fonction.
12 mars 2008 20:08:37 :
Le 09/03/2008 remplacement de quelques constantes indiquées "en dur" par le nom défini dans iso9660.inc ajout de fonctionnalités dans l'image iso. Il est possible de creer une arborescence de repertoires et de fichiers a l'aide des macros: DIRECTORY_BEGIN label[,parent] DECLARE_FILE label,texte DECLARE_DIRECTORY label,texte DIRECTORY_END label DECLARE_PATH label[,texte=0,parentid=1] exemple dans tomiso.asm, les macros sont definies dans iso9660.inc a noter que le code mbr n'utilise toujours pas cette arborescence et va directement cherher les informations fournies dans le PRIMARY_DESCRIPTOR ajout des fichiers autorun.inf et readme.txt dans l'image iso. des bugs de comptabilisation memoire totale/utilisée/libre au niveau de mm.report ont été résolus.
30 avril 2008 19:27:46 :
je vous ai fait une maj terrible ce coup-ci. ajout d'un shell (taper entrer pour les fonctions) vous aurez meme la possibilité de dumper vos ide ;-) le clavier est pas encore tres bien géré pour le moment ajout d'un debut de gestion filesystem malloc et mfree completement operationnels grande amelioration de la fonction printf. un ch'ti bout de scheduleur et de multi-tache et pour finir, un module v86 qui apres m'en avoir fait bavé (bios qui change sa table d'interruption,...) est operationnel et permet donc d'appeler les fonctions bios en mode protégé oui monsieur, c'est possible. le live cd est pour bientot si je continue dans ma lancée.
30 avril 2008 19:30:42 :
je vous ai fait une maj terrible ce coup-ci. ajout d'un shell (taper entrer pour les fonctions) vous aurez meme la possibilité de dumper vos ide ;-) le clavier est pas encore tres bien géré pour le moment ajout d'un debut de gestion filesystem malloc et mfree completement operationnels grande amelioration de la fonction printf. un ch'ti bout de scheduleur et de multi-tache et pour finir, un module v86 qui apres m'en avoir fait bavé (bios qui change sa table d'interruption,...) est operationnel et permet donc d'appeler les fonctions bios en mode protégé oui monsieur, c'est possible. le live cd est pour bientot si je continue dans ma lancée.
07 mai 2008 17:41:54 :
et ben, .... on est presque à la version 1.0 car je commence a travailler sur le linker et le travail restant est encore énorme. Le clavier est beaucoup mieux géré meme si c pas encore ça, c'est un vrai mic mac ce que sort le clavier en information. Ajout d'un type d'objet CIN que j'ai codé pour creer un doskey Like. La ligne de commande ça va 5 mn. Ah oui, le code torito va maintenant chercher son loader sur la racine du CD.
21 mai 2008 17:19:19 :
le code torito a été changé afin de rechercher le loader dans la racine du cd plutot que par kes informations lues dans le volume descriptor.

 Sources du même auteur

Source avec Zip SCHEDULEUR TEST
Source avec Zip Source avec une capture LIVE CD OMF
Source avec Zip V86 HOOK BIOS/DOS
Source avec Zip HIDEVCD OU ANTI-BLAXX LIKE
Source avec Zip COFFVIEW

 Sources de la même categorie

DÉPLACEMENT D'UN RÉCTANGLE ROUGE A L'AIDE DE LA SOURIS par KIMI1632
Source avec Zip SCHEDULEUR TEST par patatalo
Source avec Zip Source avec une capture LIVE CD OMF par patatalo
Source avec Zip "MORTIMER": UN HOBBY OS par bofur
Source avec Zip Source avec une capture LE SYSTÈME D'EXPLOITATION LOGRAM par steckdenis

 Sources en rapport avec celle ci

Source avec Zip COMMENT FAIRE UN LIVECD par aloneinthedark
Source avec Zip BOOT DEPUIS UNE DISQUETTE FORMATTÉ DOS par bofur
Source avec Zip AUTO BOOT par HwW_Mb
Source avec Zip BOOT PONG par barbichette
Source avec Zip SECTEUR BOOT, KERNEL ET CHARGEUR BOOT par sajaris

Commentaires et avis

Commentaire de aloneinthedark le 27/06/2007 00:14:10

salut,
bonne source, mais je ne connais pas encore assez l'assmebleur pour tout comprendre notament l'organisation des fichiers, le boot le noyau etc..
sinon y'a de l'idée
bon courage
a plus.

Commentaire de patatalo le 27/06/2007 15:28:55 administrateur CS

salut,

dans tomiso.asm qui simule une structure iso 9660:

;******************************************************************************
MBR_CODE:
incbin "torito.bif"         ; le boot

;******************************************************************************
LOADER_CODE:
incbin "eprom.com"          ; le noyau
endsector
.END
;******************************************************************************

tu peux remplacer "eprom.com" par n'importe quel binaire (taille max = 640Ko-(64Ko+400h+100h), environ 575Ko) et il sera chargé et éxécuté a l'adresse 1000:0100 (parametres modifiables a tomiso.asm:PRIMARY_VOLUME_DESCRIPTOR.VD_PRIMARY.appuse)

dans tomiso.asm:
at VD_PRIMARY.appuse,db "TOM",0                                          ; signature
                     dd ((LOADER_CODE.END-LOADER_CODE) / SECTEUR_SIZE)   ; taille du loader, sera recalculé automatiquement              dd ((LOADER_CODE-$$) / SECTEUR_SIZE)                ; ou le trouver dans l'image iso, ne devrait pas changer
                     dw 0x1010                                           ; segment de chargement ( mettre
                     dw 0x100                                            ; offset d'execution
                     dw 0x1000                                           ; segment d'execution

la structure est definie dans torito.asm:

struc TOM ;
.sig resd 1 ; signature = "TOM",0
.scnt resd 1 ; taille en secteur
.sec resd 1 ; secteur pour le loader
.ldseg resw 1 ; segment de chargement
.exoff resw 1 ; offset d'execution
.exseg resw 1 ; segment d'execution
endstruc

si tu modifie la signature change dans torito.asm:

; verification de "TOM"
mov ax,SEG_PRIDESC
mov es,ax
cmp dword [es:VD_PRIMARY.appuse+TOM.sig],'TOM'
lea si,[msg_exit4]
jne exit0

tu vois qu'il n'y a pas grand chose a comprendre pour mettre son propre kernel ou loader.

le reste n'est que de connaitre l'iso9660 et la spécification des cd bootables "el torito", tu peux avoir tout ces documents gratos sur le net (sur www.t13.org, je pense que c'est sur ce site que je les avais trouvés à l'époque).

@++

Commentaire de patatalo le 01/09/2007 15:23:49 administrateur CS

top top
le boot fonctionne sur le logiciel Virtual PC 2007 de chez microsoft
telechargeable gratuitement à http://www.clubic.com/telecharger-fiche22855-virtual-pc.html

Commentaire de sajaris le 28/02/2008 20:34:34

dommage que j'ai vu ce post si tard. Mais il a repondu en grande partie a une question qui me tracassait : comment booter a partir d'un CD et charger le noyau.

Mais dans le code source de TORITO.ASM, je comprend pas trop la philosophie.
J'ai en fait deux questions:

1-CONCERNANT LA NORME TORITO:
   est ce que je peux, pour la structure de mon iso, n'utiliser que
    ---les 16 secteurs vide a remplir
    ---le descripteur de volume primaire
    ---le descritpeur TORITO
    ---le descritpeutr Terminateur
    ---le VALIDATION ENTRY
    ---le default entry
    ---puis charger le boot (incbin)
    --- et charger mon image (incbin)
Cela signifie que j'annule les path table et directory (cela signifie modier des champs dans le primary descriptor qui utilise des données des ces descripteurs)

2-CONCERNANT LE NOYAU
  si le noyau est (comme dans ta source) inserer apres le boot (par incbin), comment puis je calculer la zone memoire sur le secteur CD, me positionner et le charger en memoire (je sais pas en fait comment retrouver les données sur le cd pour le charger, aussi bien des fichiers binaires que j'ai inclu via incbin dans l'iso (invisible le plus souvent sous windows), ou des fichiers binaires en plus que j'aurai graver par avec nero par exemple (visible sous windows).  

Je pense que c'est trop tedemander mais pourrait tu comment ta source torito.asm et le poster ici ou dans ma boite sajaris2002@yahoo.fr (vraiment je butine sur le sujet depuis 3Mois et j'avais pas encore vu cette source qui m'aurait tout de suite orienté, alors je m'accroche, et merci de me comprendre)

Merci et a bientot

Commentaire de sajaris le 28/02/2008 20:57:10

salut
je voulais ajouter aussi qu'il ya des sauts sans comparaison dans ton code torito.asm.
Je vois des jb je et pas de cmp avant ces jump). c'est normal?


REMARQUE: Lorsque je grave l'image et je boot du cd, il s'arrete au message de demande de boot du cd

J'attend impatiemment tes reponses a mes questions

Commentaire de patatalo le 02/03/2008 13:26:20 administrateur CS

salut,

pour les normes torito, je me rappelle plus trop, essaye ou tape "specification torito" dans google tu devrais pouvoir choper un pdf.

les sauts conditionels jb,... sans cmp devant sont normaux, pratiquement toutes les operations modifient le registre des flags pour des conditions bien particulieres a l'operande utilisée voir la doc intel.

il est possible que la version fournie soit issue d'un emulateur pc de chez crosoft. Quel est ton system pc ?

@++

Commentaire de patatalo le 02/03/2008 13:38:12 administrateur CS

re,

je viens de remater le code et les jb sont la réponse fournie par la fonction xint13 qui retourne carry si une  erreure se produit.

l'operande lea ne modifie pas le registre des flags, c'est pourquoi je l'utilise beaucoup (meme pour une simple incrementation).

si tu as le message de demande de boot c'est que déjà tu as booté (ouais), le code torito fonctionne je pense plus a un probleme avec le code eprom, c'est la difficulté de la programmation system, pouvoir etre compatible avec un autre ordinateur que le sien personnel, y'a toujours des mmmm.

c'est peut etre aussi que j'ai mis un eprom test qui fonctionne pas, ça m'etonnerais pas de moi ...

je vais voir ça.

@++

Commentaire de sajaris le 02/03/2008 19:19:10

Salut,

merci de m'avoir repondu.

Pour les "jb" "je" sans "cmp", j'ai compris (effectivment il ya des operation qui modifie les flags surtout CF)

Mais une de mes question etaient comment lire les données sur le CD-ROM apres boot
AUssi je n'arrive pas a utiliser la fonction 48h int 13 (bios etendu), pour avoir les info sur le disque (il me renvoie des données bizarre). As tu deja implementé cette fonction?

Commentaire de sajaris le 02/03/2008 19:25:42

Re:

Je disais plus haut que le CD bootait et plus rien, mon pc est un toshiba satelitte

Pour mieu comprendre aussi la philosophie du boot sur disque de grande capacité:
Apres boot, je teste si les extension bios sont pris en compte (ah=41h- int 13h)
si oui alors je capture la geometrie du disque(ah=48h - int 13h) qui renvoie le resultat
je peut alors avoir la geometrie du disque et lire un secteur a partir de son numero

si les extension ne sont pas pris en compte (cela veut dire que je ne peux plus avoir acces a la totalité du disque) alors je convertie LBA-CHS et je fais un acces disque classique (ah=08 - int 13h)


C'est bien cela?

Commentaire de patatalo le 04/03/2008 21:17:38 administrateur CS

re,

oui mais attention, en CHS, tu ne pourras pas acceder a plus de 8Go dans tous les cas.Tu ne peux donc convertir le lba -> chs que si ton bloc complet est en dessous de 8Go. ( dernier LBA * secteur size < 8Go )

Le mode LBA est tellement vieux, qu'il te faudrait vraiment avoir un ordinateur vieux de chez vieux pour qu'il n'y ait pas cette extention bios.

jamais implémenté la fonction 48h mais verifie que ds:si pointe vers un buffer de taille 1Eh au moins, le premier mot doit indiquer la taille donc = 1Eh. Ne l'appelle pas pour un lecteur CD (pas de CHS pour eux ou en mode emulation uniquement). verifie aussi que ton flag carry n'est pas a 1 car cela indiquerait une erreure.

http://en.wikipedia.org/wiki/INT_13

@++

Commentaire de patatalo le 04/03/2008 22:38:33 administrateur CS

re,


j'ai testé et ça fonctionne sur mon ordi donc y'a un truc incompatible avec ton pc. Peut-etre la methode pour autoriser la ligne A20.

le source de l'eprom est là:
http://www.asmfr.com/codes/LOADER32-MEMORY-MANAGER_35847.aspx

@++

Commentaire de sajaris le 05/03/2008 09:22:01

salut PATATALO, tu va bien j'espere....

Bon, pour la fonction bios 48h, j'avais juste un probleme pour ma fonction d'affichage de chiffre et de conversion entier-hexa (pas terrible mais fonctionnel). en fait apres appel de cette fonction, je recupere les donnée dans un buffer resultat et j'affiche. Mais tout es rentré dans l'ordre.

Quand j'appelle cette fonction (ah=48h int 13h) il me renvoie un tableau ou je peux avoir la totalité du nombre de secteurs du disque ainsi que la taille d'un secteur et quand je teste sur different machine, j'ai effectivement la taille totale du disque (nbsecteur x tailleSecteur).

Tous semble aller de plus en plus (et grace a toi merci car je me suis entierement inspiré de ta source pour comprendre)

Maintenant la grande question qui n'est toujours pas repondu:
COMMENT AVOIR ACCES a un secteur du disque (ou du CD-ROM) et le lire? Comment acceder a un repertoire ou un fichier que j'ai graver sur le CD? (j'ai reussi, avec ton modele torito.iso a cree des nom de repertoire dans la struture iso! super!)

Je mets la source que j'utilise mais qui fonctionne pas:
--------> Ma structure DAP
struc struct_dap
.size resb 1
.rsv1 resb 1
.nbblk resb  1
.rsv2 resb 1
.hostaddr resd 1
.lgblk resd 2
.lbaaddr resd 2
.nbblklba resd 1
.rsv3 resd 1
endstruc

------>Une instanciation de la structure
dap:
istruc struct_dap
at struct_dap.size, db 32
at struct_dap.nbblk, db 0FFh
;at struct_dap.hostaddr, dw 0FFFFh
; dw 0FFFFh
;at struct_dap.lgblk, dd 0023
; dd 0000
at struct_dap.lbaaddr, dd 1000h
dd 0h
at struct_dap.nbblklba, dd 0001h
iend
--------> Mon code de lecture
        ;apres test de la fonction 41h et si tout va bien
mov ah,42h ; fonction lecture
mov dl,[bootdrive] ; mon lecteur de boot ici le cd-rom
mov si,dap ; offset de ma struture dap
int 13h ; appel de la fonction
jb kerError ; si erreur on saute a un label
db 0EAh ; sinon on fait un far jmp sur l'adresse 0h:1000h
dw 1000h
dw 0h

J'UTILISE NASM

Je comprend pas bien des partie du DAP:
Comme je sais que les extesnion sont prise en charge, alors je veux y acceder donc j'ai renseigner l'offset 10h et 18h qui sont l'adresse lineaire et le nombre de secteur. Pour que cela soit prise en compte je doit renseigné l'offset 4h a 0FFh, ce que j'ai fait.

Mais a l'appele de la fonction , ca marche pas. Ou j'ai cloché?

PS: Merci pour l'eclairciement de la limite des 8Go. Effetviement je peux pas depasser cela en mode classique des 13H.

PS2: TU dis que le mode LBA est vieux, c'est pas plutot le mode CHS qui est assez vieux, ou j'ai rien pigé ;)

Commentaire de sajaris le 05/03/2008 09:29:14

Re:
Pour la source la ou il y a des ';' c'est des commentaires en NASM que j'aurai du enlever ici.
En fait je n'arrive pas a charger mon kernel.bin. Quand je regarde sa position dans la structure iso, il est au secteur 23. comment y accéder et le lancer? Si j'ai d'autre fichier comment les retrouver et les utiliser? (je sais pas si c'est possible mais tu as peut etre une idée la dessus)

Merci encore pour m'avoir eclairer pour le LBA-CHS (en fait j'étais vraiment dans le noir, on en apprend vraiment chaque jour quand on s'y met vraiment dans quelque chose)

Commentaire de sajaris le 05/03/2008 09:44:12

Re:

Je donne mon explication de la Device Address PAcket (DAP), c'est ainsi que je le comprend et l'implement. Corrige si c'est pas cela

struc struct_dap
.size resb 1 ; taille du dap, ici ca fait 32 octet
.rsv1 resb 1  ; reserve
.nbblk resb  1 ; nombre de block a lire, si egal a 0FFh on utilise nbblklba
.rsv2 resb 1  ;reserve
.hostaddr resd 1 ; buffer où transferer la lecture si nbblk != de 0FFH
.lgblk resd 2 ; numero secteur LBA qui est utilisé
.lbaaddr resd 2 ; addresse lineaire utilisée au cas ou nbblk != de 0FFH
.nbblklba resd 1 ; nombre de block LBA utilisé  au cas ou nbblk != de 0FFH
.rsv3 resd 1 ;reserve
endstruc

voici une explication de l'implementation:

dap:
istruc struct_dap
at struct_dap.size, db 32 ; taille de mon dap
at struct_dap.nbblk, db 0FFh ; ainsi j'utilise les donnée lba
at struct_dap.lgblk, dd 0023 ; numero du secteur a charger
dd 0000 ; c'est en 8 octet, je met les 4 dernier a 0
at struct_dap.lbaaddr, dd 1000h ; offset lbalo de chargement
dd 0h    ;segment lbalhi de chargement
at struct_dap.nbblklba, dd 0001h ; nombre de block a telecharger
iend

j'avais mis certains en commentaire dans les message precedent

Commentaire de patatalo le 05/03/2008 19:49:50 administrateur CS

re,


pour la structure DAP, c'est beaucoup plus simple que ça:

struc DAP ; DEVICE ADDRESS PACKET
.len: resb 1 ;taille de la structure = sizeof DAP
.res1: resb 1 ;reservé
.nsec: resb 1 ;nb secteurs a lire ( !! 32 max je crois)
.res2: resb 1 ;reservé
.offs: resw 1 ;offset de chargement
.seg: resw 1 ;segment de chargement
.lbalo: resd 1; secteur lba a lire (dword de poids faible)
.lbahi: resd 1; secteur lba a lire (dword de poids fort)
endstruc

la structure dap utilise toujours le mode lba.
le secteur lba a une taille de 64bits. (d'ou le lo et hi)
le premier secteur lba est 1 et pas 0.
tu ne peux lire que 64Ko par 64Ko.
secteurs max lisible par appel de int 13h fct 42h:
HDD = 65536/512 = 128
CD =  65536/2048 = 32

dans torito.asm, la fonction xint13 fait une lecture disque avec ces parametres:
xint13:;(lecteur,lbalo,lbahi,seg,nsec):CARRY
elle a été conçue specifiquement pour lire un cd et pas un disque dur. (la mise a jour du segment est pour des secteurs de 2048 octets)
tous les parametres sont des WORD.
je ne gère pas l'offset qui sera tj 0 mais j'incremente directement le segment, cela simplifie beaucoup et evite les debordement de segment en autorisant une lecture de 64Ko max.
je ne gère pas non plus les secteur lba de 64bits mais de 32bits seulement vu que c'etait pour un cd.

pour les cd fait attention car la taille des secteurs n'est pas de 512 octets comme pour les disques durs mais de 2048 octets. le bios refuse les lectures de plus de 64Ko qui sont pour lui la taille d'un segment entier. Si tu utilise l'offset, la taille max et amoindrie d'autant car tu ne peux pas déborder sur le segment.

@++

Commentaire de patatalo le 05/03/2008 20:05:43 administrateur CS

re,


si le mode CHS est tres tres tres tres vieux, le mode LBA est tres tres tres vieux ;-) (depuis quand ne voit-on plus des disques durs de taille < 8Go ?)

pour retrouver d'autres fichiers, il te suffira de lire les DIRECTORY_RECORD et autres, de suivre les secteurs indiqués je me rappelle plus trop de la spécification et je ne l'ai pas impléménté dans le source, l'endroit ou se trouve le kernel est directement indiqué dans le PRIMARY DESCRIPTOR ce qui m'evite a rechercher le nom de fichier et son emplacement sur le cd.

j'essaierais de me pencher sur le truc mais je te promet rien.

@++

Commentaire de sajaris le 06/03/2008 18:48:57

Salut PATATALO,

merci de bien vouloir m'aider sur la recherche des données sur le CD.

PATATALO<"
tu ne peux lire que 64Ko par 64Ko.
secteurs max lisible par appel de int 13h fct 42h:
HDD = 65536/512 = 128
CD =  65536/2048 = 32>"

C'est ce que fait ta fonction? je l'ai passer en revu pour essayer de comprendre. j'avais compris que c'est ccela que tu utilisait pour acceder au disque mais j'ai pas compris tout le code. Je sais que tu stocke des données dans la pile (segement offset, adresse du primary descrition volume). Ensuite tu detourne une interruption 1Ch (je sais pas trop pourquoi).

Je sais que je te demande trop de chose, mais si tu pouvais ecrire la fonction ici et me l'expliquer je pourrai la comprendre mieu et l'implementer plus facilement. Je peux deja, creer un boot, et lire la taille du disque, et autre, si j'arrive a faire cela, je pourrai m'en sortir pour le reste, mais j'ai encore essayé pour lire par pas de 64ko mais j'ai encore raté).

Commentaire de sajaris le 07/03/2008 09:48:54

salut;

comment je peux effectuer la lecture pas le bios ? (en utilisant ta technique des 64ko par 64)

Commentaire de sajaris le 07/03/2008 22:47:06

Salut,

j'ai repassé ta fonction xint13:
avant l'aéppel de la procedure, tu sauvegarde les parametres nbrsec,seg,lbahi,lbalo,lecteur dans la pile.

Apres appel de la fonction tui prepare la zone du dap (rn decrementant sp, puis si=sp). jusque la ca va.

Puis tu remplie ces zone avec les données exactes: mov [si+dap.size],ax  [si+dap.seg], ax......

apres cela, au niveau du label .3, la j'ai rien pigé. du fait dec [si-4], je ne vois pas la valeur qui se trouve a cette adresse !!!!!

Que fait exactement un ret 5*2 ??

j'attend vraiment impatiemment tes commentaires meme si c'ets sur quelque partie de cette fameuse xint13..

Commentaire de sajaris le 08/03/2008 12:45:10

Re:
j'ai regardé de plus pres ta fonction.  je crois avoir compris, mais le mien ne marche toujours pas.
En somme:
avant l'appel de ta fonction: tu tu sauvegarde les parametres nbrsec,seg,lbahi,lbalo,lecteur dans la pile.
puis tu prepare la zone pous la strucutre dap dans la pile (sub sp,16)

Ensuite tu lie le un secteur a partir du secteur 16 (sur le disque ca corresponde au primary volume).
tu essai la lecture au moins 5 fois (push byte 5). si ca marchhe toujours pas tu sort avec un message d'erreur. sinon tu continue la lecture en verifiant de ne pas depasser la taille d'un segment.

Si j'essai de comprendre ton xint13, c'etait en fait pour voir ou MOI j'ai cloché, le eprom fait au moins 9k0 (environs 5 secteur de cd). Mon kernel ne fait que 86octet(un test). alors je charge juste un secteur.

bah merci d'avoir essayé en tout cas.

Commentaire de sajaris le 08/03/2008 13:15:21

j'ai finalement capturé la sortie de l'erreur qui se trouve dans AH en cas d'erreur de lecture.

Losrque j'affiche le numero de l'erreur et je me referre a sa signification (sur google) voici ce que je trouve, que ce soit avec ton projet ou avec ma fonction de lecture:

incorrect drive type stored in CMOS (Compaq)

Commentaire de sajaris le 11/03/2008 09:07:02

re:
salut,

bon maintenant ca va , tout marche bien.en fait j'ai juste changer l'adresse memoire de chargement dans le dap, avant j'utilisait 0100:0 et lorsque j'ai changer a 0:1000 (en rensignant les bon champ de mon DAP) tout a marcher, le kernel est charger en memoire. je pensais que 0100h:0h et 0:1000h pointait sur la meme zone, donc il ne devait pas y avoir de probleme, bah je comprend pas trop, mais avec la perseverance on arrive a tout, jamais baiiser les bras.

En tout cas merci PATATALO, tu a ete une source d'inspiration et j'ai reussi a faire un mini-os bootable sur CD avec 5 commandes test (reboot,clrscr,..) et tout ceci a base de ton tuto.merci bien

Commentaire de patatalo le 11/03/2008 21:41:29 administrateur CS

salut,

désolé pour le temps mais j'ai pas toujours internet. J'ai travaillé un peu sur le cdfs et je t'ai concocté quelques macros pour creer une arborescence facile des repertoires et fichiers sur cd.

l'adresse 0100h:0 et 0:1000h pointe vers le meme endroit en mode flat seg*16+offset = dans les 2 cas ca donne 1000h
seulement en mode réel, un segment a 0 ou a 100h ne te donne pas acces a la meme portion de memoire. Le segment, c'est la base de ton acces memoire.

avec 100h:0 tu accede de base=1000h a top=1FFFF (flat)
avec 0:1000h tu accede de base=0 a top=FFFFh (flat) sauf que ton offset est donné a 1000h

j'ai oublié la clé usb à la maison, je poste la nouvelle version dès que possible.

@++
@++

Commentaire de sajaris le 12/03/2008 09:38:49

Content de ton retour!!!
je me demandais effectivment ou t'etais passé !!!

DOMMAGE QUE TU ES OUBLIE TA CLE USB !!   j'attends impatiemment ces scripts, impatiemment !!!!

Merci pour cette précision pour les accès mémoires !

Commentaire de patatalo le 12/03/2008 20:17:32 administrateur CS

voilà c'est mis a jour.
ça m'as permis de rajouter un autorun ;-)
tu regarderas dans tomiso.asm et iso9660.inc pour les macros

La Path Table est un tabeau de PATH_RECORD
et les directories sont des tableaux de DIRECTORY_RECORD meme pour un fichier.

je t'avais dis que le premier secteur LBA etait le 1 mais c'est 0 en fait. c'est le CHS qui commence par 1.


ici, http://www.singlix.com/trdos/specs.html tu trouveras plein de trucs interessant et notement le fichier IntroductionToIso9660.pdf.

@++

Commentaire de sajaris le 13/03/2008 09:33:46

SAlut, bah je sais pas quoi dire de plus sinon merci humblement a toi.  

Au fait une précision. J'avais dit dans un un post plus haut, que le chargement de mon noyau ne marchait pas, et avec une erreur. et en changeant la memoire de chargement (segment et offset) tout etait rentré dans l'ordre. Hé bien en fait je gravais mon image produit sur cd-rom, et la gravure se faisait mal en fait (mon graveur etait HS mais le gravage marquait avec succes!!), en fait tout marchait depuis longtemps pour le chargement du noyau. j'utilise maintenant VMWare.

Je sais pas comment tu trouve des infos sur tout ceci, mais tu les trouve en tout cas.
voici un autre site (que tu connais déjà je crois) sur les spécifications usb,plug n play et autres. le site de phoenix:http://www.phoenix.com/en/Customer+Services/White+Papers-Specs/PC+Industry+Specifications.htm

Merci en tout cas, j'ai de quoi ne pas m'ennuyer pendant plusieurs temps.

J'ai telecharger et utiliser ton image ca marche parfaitement ,je vais essayer de comprendre maintenant. ;)

Commentaire de sajaris le 13/03/2008 13:24:01

PATALTALO:"<ici, http://www.singlix.com/trdos/specs.html tu trouveras plein de trucs interessant et notement le fichier IntroductionToIso9660.pdf>"

je l'ai parcouru, juste une chose, c'est un MUST, merci vraiment PATATALO. sans blague, j'ai vraiment appris en moins d'un mois beaucoup avec toi.

Courage et continue dans cette lancée.

j'espere pouvoir construire quelque LIVE CD  plus tard avec toi, pour l'instant j'avance bien.

Commentaire de edfed le 15/03/2008 04:07:18

je verrais bien un petit jeu de roles à la fallout, mais mieux; et en assembler. grace à un live CD, pas besoin de direct X pour ça ou de 4G de disque dur.

juste un live CD avec capacité de lecture des 700MB sur le disque. et un peu de sauvegardes sur disque dur et disquette.

ça devrait etre possible.

Commentaire de sajaris le 15/03/2008 16:20:25

Edfed rien n'est impossible, mais c'est vraiment refaire plein de routines, tu sais, mais pourquoi pas! le coté intéressant de la chose c'est de se familiarisé avec la basse couche total et comprendre plein de truc actuel.

Au fait patatalo, j'ai compris les macros que tu as envoyé, et c'est bon j'arrive à reperer mes données sur le CD-rom, en fait j'interprétais mal la constitution des répertoires. Je sais pas que la déclaration d'un enregistrement de répertoire se faisait dans son repertoire parent et AUSSI que chaque répertoire n'est jamais vide mais avait au moins un repertoire parent et courant

Commentaire de patatalo le 15/03/2008 16:21:38 administrateur CS

salut EDFED

le support clé usb pourrait aussi etre interessant et bonjour la protection par dongle si le system est intégré ça doit etre chaud a casser.

@++

Commentaire de edfed le 16/03/2008 21:59:02

combien peu faire le fichier binaire qu'on veu charger au boot?
real mode, unreal mode, flatmode, segmented, ???

pasqu'un jeu, si on le veu bien gros et bien rapide, il faut qu'il soit en RAM en entier.

si on à 32Mo de RAM pour le jeu, c'est parfait.
on peu faire un truc enorme, et sans la moindre notion de systeme de fichier.
une simple image binaire qui contient tout.

apres, on charge le noyaux, qui vat lance notre programme.
une librairie est quelque part dans les 32Mo.

le jeu, il controle rien, tout est controlé par la librairie qui est utilisée par le jeu.

Commentaire de patatalo le 30/04/2008 18:08:52 administrateur CS

salut,

le seul petit soucis et que cette image binaire de 32 Mo doit comprendre toute la floppée de drivers qui va avec toute la flopée de materiel divers et variés inclus dans un PC.

je vous ai fait une maj terrible ce coup-ci.
ajout d'un shell (taper entrer pour les fonctions)
  vous aurez meme la possibilité de dumper vos ide ;-)
le clavier est pas encore tres bien géré pour le moment
ajout d'un debut de gestion filesystem
malloc et mfree completement operationnels
grande amelioration de la fonction printf.
un ch'ti bout de scheduleur et de multi-tache
et pour finir, un module v86 qui apres m'en avoir fait bavé (bios qui change sa table d'interruption,...) est operationnel et permet donc d'appeler les fonctions bios en mode protégé oui monsieur, c'est possible.

je vous invite donc a tester cette mouture 0.4.2

la version 1.0.0 avec chargement de fichier et linker est pour bientot comme vous le constaterez...

@++

Commentaire de sajaris le 01/05/2008 20:50:15

salut patatalo, cel fiat deux jours ;)

Encore une fois tu fais des merveilles, moi je pietine sur la table d'interruption apres passage en mode bios, je sais pas trop comment refaire ma table ou plutot j'en ai fait mais qui ne marche pas (alors j'ai pas su bien faire)

Mais cool pour toi. je demanderai encore de tes services, je continue de chercher d'abord(bah oui il faut d'abord soufrir pour trouver soi meme) si je n'aaarive pas alors je te pince ;)

A toute!

Commentaire de sajaris le 12/06/2008 18:45:50

salut,

cela fait un bail. je reviens avec un probleme que je rencontre depuis 3 semaine avec mon passage en mode protege et l'initialisation de mon IDT. franchement je bute. j'ai tester toutes les combinaison possibles.

je donne le code et je le detaille pour etre mieu compris:

***************************  LE BOOT: ****************************

jmp start:


gdt:
db 0,0,0,0,0,0,0,0

gdt_cs:
db 0xFF,0xFF,0h,0h,0h,10011011b,11011111b,0h ;type=11 pous cs

gdt_ds:
db 0xFF,0xFF,0h,0h,0h,10010011b,11011111b,0h ;type=3 pour ds

gdt_ss:
db 0xFF,0xFF,0h,0h,0h,10010111b,11011111b,0h ;type=7 pour ss

gdt_end:

gdt_ptr:
dw 0000h
dd 0


start:
PRINT_TXT kerLoadLabel ;on affiche chargement de kernel

;---------------------initialisation de la structure de la GDT(limite,base)
;----Calcul de la Limite de la GDT
mov ax,gdt_end
mov bx,gdt
sub ax,bx
mov word[gdt_ptr],ax

;-------calcul de la base de la GDT segment*16 + offs
xor eax,eax ;init reg 32 bit
xor ebx,ebx
mov ax,ds ;recuperation du seg en decimal
shl eax,4 ;seg*16
mov bx,gdt
add eax,ebx
mov dword[gdt_ptr+2],eax

;--------------FIN DE LA FABRICATION DE LA GDT---
cli

lgdt [gdt_ptr]


;passage en mode protegé. Il faut mettre le bit 1 du registre cr0 a 1
mov eax,cr0
or ax,1
mov cr0,eax

jmp 08h:2000h;saut vers la memoire ou le nouyau a ete charger


voila c'est finit pour le boot, j'espere avoir bien commenté. jusque la ca va pour le boot, je le donne au cas ou vous avez d'autres suggestion, ou si je m'y suis mal pris. au passage je dirai que j'initialisait les segment ds,es,... avec leur adresse selecteur (10h) avant le saut vers le noyau, mais ce n'est pas indispensable car ca marche apres dans le kernel meme si je ne le fait pas(ce n''est pas indispensable car dans le kernel je refais tout)

On passe au noyau(que j'appel kernel).

**************************** NOYAU 32 BITS *********************
[BITS 32] ; instruction sur 32 bit
[org 0x2000] ; offset de depart

jmp start
%define IDTBASE 0h
%define GDTBASE 800h

%define INT_FLAG 0x8E
%define TRAP_FLAG 0x8F
%define COM_FLAG 0x80

%include "utils/pic.inc" ; initilaise le PIC.
%include "utils/macro.inc" ; pour utilisit la fonction gateInit

;initiazlise les selecteur apres saut a partir du boot
start:
mov ax,10h ; la gdt_ds
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax

cli ; on desactive tout
;
;-------initialisation de la structure de la GDT(limite,base)
;----Calcul de la Limite de la nouvelle GDT
mov ax,gdtmp_end
mov bx,gdtmp
sub ax,bx
mov word[gdtmp_ptr],ax
xor ecx,ecx

;-------base de la GDT
mov ecx,dword[GDTBASE]
mov dword[gdtmp_ptr+2],ecx


;--------------TRANSFERT GDT (on copie gdtmp a GDTBASE)
xor ecx,ecx
mov cx,word[gdtmp_ptr]
xor esi,esi
xor edi,edi
lea si,[gdtmp]
lea di,[GDTBASE]
rep movsb

lgdt [gdtmp_ptr]; on charge la GDT

jmp 08h:next1 ; petit saut d'initialisation

next1:
mov ax,10h ;
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax

;---------------initialisation de la structure de la IDT(limite,base)
;----Calcul de la Limite de la IDT
mov ax,800h ; je reserve l'espace pour les 256 interruption
mov word[idt_ptr],ax ; j'ai l'impression que ca plante ici.car si je met un jmp $ avant cette instrtuction, il n'y pas plantage
xor ecx,ecx

;-------base de la IDT
mov ecx,[IDTBASE]
mov dword[idt_ptr+2],ecx

;---------------TRANSFERT IDT
xor ecx,ecx
mov cx,word[idt_ptr]
xor esi,esi
xor edi,edi
lea si,[idt]
lea di,[IDTBASE]
rep movsb

lidt [idt_ptr]; on charge l'IDT

initPIC ; appel de la fonction initPIC contenu dans le fichier pic.inc ci dessous
gateInit 8h,interrupt,INT_FLAG,0,IDTBASE+8h*112 ; appel de la fonction gateInit definti dans le fic

sti
ker:
mov byte[0xB8002],'E'
mov byte[0xB8003],57h
mov byte[0xB8004],'L'
mov byte[0xB8005],57h
mov byte[0xB8006],'L'
mov byte[0xB8007],57h
mov byte[0xB8008],'O'
mov byte[0xB8009],57h

mov byte[0xB800A],' '
mov byte[0xB800B],57h

mov byte[0xB800C],'W'
mov byte[0xB800D],57h
mov byte[0xB800E],'O'
mov byte[0xB800F],57h
mov byte[0xB8010],'R'
mov byte[0xB8011],57h
mov byte[0xB8012],'L'
mov byte[0xB8013],57h
mov byte[0xB8014],'D'
mov byte[0xB8015],57h

jmp $


;-------------LES DONNEES UTILISEES
gdtmp:
db 0,0,0,0,0,0,0,0

gdtmp_cs:
db 0xFF,0xFF,0h,0h,0h,10011011b,11011111b,0h ;type=11 pous cs

gdtmp_ds:
db 0xFF,0xFF,0h,0h,0h,10010011b,11011111b,0h ;type=3 pour ds

gdtmp_ss:
db 0xFF,0xFF,0h,0h,0h,10010111b,11011111b,0h ;type=7 pour ss

gdtmp_end:

gdtmp_ptr:
dw 0000h
dd 0

;---------------------- IDT
idt:
times 256 dw 0,0,0,0
idt_end:

idt_ptr:
dw 0000h
dd 0h


interrupt: ; utiliser pour initialiser les interruption

mov al,20h
out 20h,al
iret

************************** INITAILISATIOn DU PIC APPELELE DANS LE KERNEL ***********

%macro initPic 0
;---MAITRE
;-----Initilaise le maitre
mov al,11
out 20h,al
jmp .1
.1
;------La base des interruptions. Ici 32=20h. On laisse en fait 32 interruption exception
mov al,20h
out 21h,al
jmp .2
.2
mov al,04h
out 21h,al
jmp .3
.3
mov al,1h
out 21h,al
jmp .4
.4
mov al,0h
out 21h,al

;---SLAVE
;-----Initilaise l'esclave
mov al,11
out 0A0h,al
jmp .5
.5
;------La base des interruptions. Ici 112=70h. On laisse en fait 112 interruption exception
mov al,70h
out 0A1h,al
jmp .6
.6
mov al,02h
out 0A1h,al
jmp .7
.7
mov al,1h
out 0A1h,al
jmp .8
.8
mov al,0FFh
out 0A1h,al

;masquage des IRQ
mov al,0h
out 21h,al
%endmacro

********************GATEINIT: FONCTION D'INITIALISATION DE LA IDT ***************

%macro gateInit 5 ;selecteur(16), offset(32),type(8), wx(5/8), adresse(32)
push eax
;selecteur
mov word[%5+2],%1
;offset
mov eax,%2
mov word[%5],ax
shr eax,16
mov word[%5+6],ax
;type
mov byte[%5+5],%3
;wc
mov byte[%5+4],%4
and byte[%5+4],00011111b

pop eax
%endmacro


******************************         FIN        ********************

Bon voila ce que je n'ai pas fait ou fait:
--->je n'ai pas initilaiser toutes les interruptions
---> j'ai d'abord initlisaer la GDT apvant l'IDT


Voila, si vous pouvez me donner mes erreurs et comment bien procéder pour gerer les interruption.


MERCI

Commentaire de sajaris le 17/06/2008 12:19:55

bonjour,

je voulais signaler que mes erreurs ont disparu, c'etais en fait a cause d'adresse mal gerer (je mettais des [] qui donne la valeur alors que je voulais utiliser les adresses a ces emplacement).

Donc tout va bien, quand j'acrive les inteeruption apres initilaistation des PIC et IDT, aucun plantage.

Maintneant l'interruption clavier ne donne pas et l'horloge ne semble pas fonctionner.


Commentaire de patatalo le 19/06/2008 10:48:13 administrateur CS

salut Sajaris,

quelques petits details sont effectivement a revoir, je te conseille vivement de bien lire la doc intel avant de te lancer dans ce genre de travail, tu y gagneras de ton temps.

pour l'initialisation des registres GDTR et IDTR, ce n'est pas la taille qui est indiquée dans le registre mais la limite. (taille-1)

les tables IDT et GDT devraient peut-etre etres alignées sur un DWORD

je ne te conseille pas non plus de garder la valeure BIOS 0x70 pour le pic slave mais de regrouper toutes tes HWI par exemples juste apres les exceptions:
00-1F:EXCEPTIONS
20-2F:HWIS (ou ailleurs mais regroupé)
30-FF:SERVICES KERNELS

de toute façon, le bios ne pourra pas utiliser la table IDT et les interruptions BIOS seront simulées par ton code kernel.

je serais toi, je creerai d'abord un truc déjà tout initialisé en dur dans le code et ensuite, je créerai eventuellement des fonctions dynamiques d'initialisation. N'oublie pas que ça doit aller vite quand le pic est désactivé. Une solution serait de generer une gestion minimum en dur. Ensuite, en dynamique, tu lui rajoute des fonctionnalitées (setHwi, setException, setService...)
cela te permettra de gerer les exceptions, cela te facilitera tj le deboguage. C'est encore plus utile si tu mange sur ton sommeil pour coder ton kernel ;-)

tu as également oublié de désactiver l'interruption NMI par le port 70h, cette interruption a tres peu de chance d'arriver mais si cela ce produit -> reset, elle n'est pas désactivée par un cli.

Est-il normal que tu n'ai pas d'ORG à ton code BOOT ?

il me semble que c'est l'inverse, tu accede ici au registre IMR du pic, elle sont activées quand a 0. A verifier quand meme, je n'ai rien sous les yeux.
;masquage des IRQ
mov al,0h
out 21h,al
%endmacro



@++

Commentaire de patatalo le 19/06/2008 11:19:12 administrateur CS

re,


tu n'as effectivement pas besoin de reinitialiser tes segments plusieurs fois. Tu peux le faire n'importe ou a partir du moment ou il ne sont pas utilisés. C'est a dire, pas longtemps quand meme car sinon pas d'acces memoire.

n'oublie pas non plus d'initialiser ta pile. Je n'ai pas trouvé quelle valeure elle avait dans ton code.

quand tu utilise les fonctions rep movs,cmps,scans, verifie ton flag de direction, tu pourrait copier dans la mauvaise direction sans meme t'en appercevoir. En general, il n'est pas modifié mais gerer c'est prevoir...

tu devrais vraiment profiter d'avoir des ORGS pour mettre plein de trucs en dur, apres le loader, y'auras plus d'ORG donc là d'accord, tout en dynamique.

@++

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Disquette et secteur de BOOT [ par clem2003 ] Clem2002:Salut a tous, J'aimerai savoir comment puis-je copier mon fichier binaire dans le secteur de boot de la disquette par une commande DOS si pos logiciel boot [ par TRAX44 ] Salut, je voudrai faire booter mon pc sur un logiciel fait en asm et qui n'aurai pas besoin de windows ni de ms-dos afin d'utiliser toute la capacité filesave.exe ou rediriger l'enregistrement de fichiers [ par y333 ] » filesave.exe ou rediriger l'enregistrement de fichiersVoila, il y a quelques années sur des cd de pointsoft, on pouvait trouver un programme qui per Chargement d'un noyau [ par Stormy ] Je suis en train de coder un OS simple pour comprendre le principe. Le secteur de boot est écrit comme il convient sur le premier secteur de ma disque boot sector sur image binaire [ par Sialagio ] bonjour a tousj'essaye de créer une image d'une disquette boot sans utiliser de support physique. je souhaiterais mettre un de mes progs de boot où i Probleme de boot [ par DbD ] Bonjour,Alors je fais mon OS et j'ai des problème de boot a partir d'un disquette, sur certain pc ou quand le noyau depasse 40 secteurs ca boot plus Question Asm/C++ [ par Lelys ] Bonjour,Je voudrai faire un OS, mais le problème c'est que je ne m'en sort pas en ASM...Je suis plus allese en C/C++.Mais le problème est que les syst boot [ par VBREP ] salut à tousje cherche la base de departpour creer un boot systememerci d'avance Boot / Os [ par the_best ] Qui peut m'aider ??!!:j'ai envie de faire un os mais je ne sais pas coment rendre une disquette bootale et la faire executer mon noyeau.Qui peut me t Demarrage [ par freegamer ] Bonjours,Je suis en train de develloper un programme limitant les accés en VB, mais j'aimerais aussi empecher sous dos de demarrer Windows en "mode sa


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales