TORITO LOADER & ISOEMUL

cs_aloneinthedark Messages postés 12 Date d'inscription lundi 7 mai 2007 Statut Membre Dernière intervention 16 juillet 2007 - 27 juin 2007 à 00:14
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 - 19 juin 2008 à 11:19
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/35438-torito-loader-isoemul

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 juin 2008 à 11:19
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.

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 juin 2008 à 10:48
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



@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
17 juin 2008 à 12:19
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.
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
12 juin 2008 à 18:45
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
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
1 mai 2008 à 20:50
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!
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
30 avril 2008 à 18:08
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...

@++
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
16 mars 2008 à 21:59
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.
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
15 mars 2008 à 16:21
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.

@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
15 mars 2008 à 16:20
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
edfed Messages postés 69 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 22 mars 2010 1
15 mars 2008 à 04:07
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.
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
13 mars 2008 à 13:24
PATALTALO:""

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.
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
13 mars 2008 à 09:33
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. ;)
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
12 mars 2008 à 20:17
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.

@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
12 mars 2008 à 09:38
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 !
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
11 mars 2008 à 21:41
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.

@++
@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
11 mars 2008 à 09:07
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
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
8 mars 2008 à 13:15
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)
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
8 mars 2008 à 12:45
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.
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
7 mars 2008 à 22:47
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..
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
7 mars 2008 à 09:48
salut;

comment je peux effectuer la lecture pas le bios ? (en utilisant ta technique des 64ko par 64)
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
6 mars 2008 à 18:48
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 128CD 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é).
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 mars 2008 à 20:05
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.

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 mars 2008 à 19:49
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.

@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
5 mars 2008 à 09:44
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
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
5 mars 2008 à 09:29
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)
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
5 mars 2008 à 09:22
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é ;)
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 mars 2008 à 22:38
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

@++
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 mars 2008 à 21:17
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

@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
2 mars 2008 à 19:25
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?
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
2 mars 2008 à 19:19
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?
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
2 mars 2008 à 13:38
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.

@++
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
2 mars 2008 à 13:26
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 ?

@++
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
28 févr. 2008 à 20:57
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
sajaris Messages postés 63 Date d'inscription jeudi 7 août 2003 Statut Membre Dernière intervention 1 août 2008
28 févr. 2008 à 20: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
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
1 sept. 2007 à 15:23
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
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
27 juin 2007 à 15:28
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).

@++
cs_aloneinthedark Messages postés 12 Date d'inscription lundi 7 mai 2007 Statut Membre Dernière intervention 16 juillet 2007
27 juin 2007 à 00:14
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.
Rejoignez-nous