[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info@builder.cz   Inzerce: reklama@grafika.cz

 Diskuzní forum: Assembler

Téma diskuze: Diskuse o Assembleru x86 a ostatních příbuzných tématech.

Tip: nemáte rádi v textu smajlíky? Ruší vaše zdrojové kody? Vypněte si je! (Moje nastavení / Nastavení soukromí)
boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Pauli.9 - uživatel již zaslal 51 příspěvků (IP uloženo)
Datum: 27. 06. 2009 21:07

Dobrý den,
prosím Vás o pomoc.

Na Flash (USB) disku mám boot sektor. Ten vypíše text na obrazovku.
Jak nyní mohu z tohoto disku (nebo z jiného - adresu mám) uložit několik MB (třeba až 500Mb) do paměti RAM (počítám s tím, že je dostatečně velká) se zadanými parametry adresa startu a cíle u disku a adresy startu v RAM ? A třeba i naopak z RAM do disku ?

Prostudoval jsem tucet stránek (http://www.root.cz/clanky/piseme-operacni-system-boot/ nebo http://www.icq.unas.cz/download/zos.htm atd.) a na každé bylo zadávání počtu hlav, cylindrů a sektorů, ale co když je to FLASH, který nemá hlavy ? A co když nevím, jakého typu zařízení je (HDD, flash, cf, ...) ?

<Pokud možno, tak prosím, napište mi ve volném čase celý kod>

Děkuji moc za pomoc.
S pozdravem Paulí.

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: vrtulex (Martin Dráb) - uživatel již zaslal 610 příspěvků (IP uloženo)
Datum: 28. 06. 2009 10:48

Nemusíte počítat hlavy či cylindry, pokud máte dobrou flashku, kterou BIOS zpřístupňuje pod službami přerušení 13h a zařízení podporuje LBA.

Nejsem si však jistý, zda se v reálném režimu procesoru (kdy lze využívat služeb BIOSu) dostanete k 500 MB paměti nějakým rozumným způsobem. Pokud ne, bude nutné přejít do chráněného režimu, ve kterém přerušení BIOSu využít nelze (ledaže byste přecházel vždy kvůli čtení dat z disku do reálného režimu a pak zase zpět).

S pevnými disky (jsou-li ATA či SATA) se dá komunikovat přes I/O porty.

VrtuleX
http://www.vrtulex.net
ICQ: 332970040

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Neregistrovaný uživatel: kvadroid (IP uloženo)
Datum: 28. 06. 2009 17:55

V reálném módu lze zůstat a pro přístup ke 4GB paměti si inicializovat pouze Flatmode.
Pro DOS se na nějakém tom serveru dají najít existující vytvořené dokumentované drivery pro USB disk.
Celý kód bych za využití DOSu + Pascalu klidně zkusil napsat, ale ne zadarmo.

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Pauli.9 - uživatel již zaslal 51 příspěvků (IP uloženo)
Datum: 12. 07. 2009 20:35

Hledal jsem na internetu a experimentoval, ale nepodařilo se mi nic přečíst pomocí metody LBA. Na stránkách http://www.icq.unas.cz/download/zos.htm se píše:

Citovat:

Problém přístupu k větším diskům, něž je 8 GiB, řeší služba AH=42H, která umí pracovat s diskem o velikosti 2^64 sektorů, tedy 8 biliónů TB. V dnešní době je pro LBA adresování rezervována 32-bitová hodnota v partition table o velikosti 2048 GB tedy 2^32. Toto adresování se nazývá LBA32. Registry DSconfused smileyI ukazují na adresu struktury.

Segment a ofset alokované paměti o velikosti 512 bajtů se uloží do položky Adr struktury LBA. Jestliže bude tato položka obsahovat adresu 0FFFFH:0FFFFH je nutné změnit velikost paketu v položce VelPack na hodnotu 18H a zároveň vyplnit i položku AdrEMS, která bude obsahovat adresu zabrané paměti v EMS.

;ES:BX - adresa alokované paměti

MOV AH,42H ; funkce pro čtení dat LBA
MOV DL,80H ; disk
MOV SI,OFFSET(LBA) ; ofsetová část struktury *1
MOV WORD PTR [Adr][2],ES ; segmentová cílová adresa
MOV WORD PTR [Adr][0],BX ; ofsetová cílová adresa *2
INT 13H ; volání služby BIOSu *3
NOP ; prázdná instrukce

LBA: ; struktura LBA paketu
VelPack DB 10H ; velikost paketu
Rez DB 00H ; rezervováno
VelBlk DW 0001H ; velikost bloku k přenosu
Adr DD 00000000H ; cílová adresa buferu
Pozice DQ 000000000009D5BFH ; hodnota LBA32
AdrEMS DB 08H DUP(0) ; adresa rozšířené paměti *4


Vyplnil jsem tedy registry ES a BX, ale vypsalo mi to chyby (v citaci označeno hvězdičkami):
1,2,3 comma or end of line expected
4 comma expected after operand 1

Nikde jinde jsem o LBA (či LBA32) na netu nic nenašel. Jak to zprovoznit nebo kde najít FUNKČNÍ příklad ?

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Neregistrovaný uživatel: kvadroid (IP uloženo)
Datum: 12. 07. 2009 21:19

K LBA.
Hodnota 80h v DL registru je pro primary disk master.
81h pro slave, 82/83h pro Secondary master/slave obdobně - podle zapojení na řadiči.
Po normálním bootu směřuje prostě na HDD. Po bootu z USB že by se přesměrovalo
80h na usbéčko na to bych moc nesázel, ale neni problém si první sektor vypsat
ihned po bootu a být moudřejší.

Ty chyby v assembleru, dost pošetilý přístup, vždycky je vhodné
začínat jednoduchými příklady a naučit se na nich programovat v daném
jazyce a ne se rovnou pouštět do něčeho co je poměrně oříšek a přidám si
k tomu své neznalosti jazyka a Kompileru :-( thumbs down !!!

Pro USB disk do 8 GB opravdu stačí nelámat si hlavu s 32 bitovým přístupem a pouřívat pro čtení službu AX-2 zápis AX-3

Ale i od LBA=BIOSu jde dát ruce pryč...
Jak jsem psal neni přece problém prvních pár sektorů obětovat loaderu DOSu
a natáhnout driver pro usb a následně v pohodlí vyššího jazyka napsat danou aplikaci, zvlášť když vydim ten zápas s adresovánim.

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Neregistrovaný uživatel: kvadroid (IP uloženo)
Datum: 12. 07. 2009 21:30

ta puvodni metoda vypada...
INT 13 - DISK - READ SECTOR(S) INTO MEMORY
AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer
Return: CF set on error
if AH = 11h (corrected ECC error), AL = burst length
CF clear if successful
AH = status (see #00234)
AL = number of sectors transferred (only valid if CF set for some
BIOSes)

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Pauli.9 - uživatel již zaslal 51 příspěvků (IP uloženo)
Datum: 12. 07. 2009 21:39

Zdroj pro CHS nebyl pro mě problém:

; funkce na přečtení 2. sektoru boot zařízení do 0:8000
mov ax,0h
mov es,ax
mov ah,02h ; čtení dat
;mov dl,80 ; zařízení - již je v paměti
mov dh,0h; číslo hlavy
mov cx,1 ; číslo sektoru+cylindru
mov al,1 ; pocet sectoru k nahrani
mov bx,8000h
; adresa = 0:8000
int 13h ; volání služeb biosu

Ale, co když je zařízení(HDD) o kapacitě 1TB ? Pak je nutné použít LBA32.
Dos bych nechtěl - potřebuju maximální rychlost celé PC sestavy a pracovat jen v základním programování bez předepsaných funkcí.

Jak tedy vypadá struktura LBA32 ? Někde jsem slyšel, že dokáže pracovat i se 4GB (32-bit) paměti RAM bez nutnusti složitého přecházení do protected mode.

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Neregistrovaný uživatel: kvadroid (IP uloženo)
Datum: 12. 07. 2009 22:02

Format of disk address packet:
Offset Size Description (Table 00272)
00h BYTE size of packet (10h or 18h)
01h BYTE reserved (0)
02h WORD number of blocks to transfer (max 007Fh for Phoenix EDD)
04h DWORD -> transfer buffer
08h QWORD starting absolute block number
(for non-LBA devices, compute as
(Cylinder*NumHeads + SelectedHead) * SectorPerTrack +
SelectedSector - 1
10h QWORD (EDD-3.0, optional) 64-bit flat address of transfer buffer;
used if DWORD at 04h is FFFFh:FFFFh

(testoval jsem jen cteni do 1MB)
Jestli se nemusi ani aktivovat Flat mode pro segmentove reg. ve zdrojove aplikaci a
pokud je 80h usb pak nestoji nic v ceste. To CHS jede teda pro 80h z usb?

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Pauli.9 - uživatel již zaslal 51 příspěvků (IP uloženo)
Datum: 13. 07. 2009 12:15

Citovat:
To CHS jede teda pro 80h z usb?

Po spuštění boot loaderu se do registru DL uloží číslo (adresa) zařízení, ze kterého se bootuje. Při bootování z USB jsem přes CHS zkoušel něco z disku přečíst a nakopírovat to do jiného sektoru a fungovalo to. Ale jaká to bylo číslo (adresa), nevím.

Nebyl by, prosím, lepší příklad pro to LBA32 ? [Něco jako jsem napsal já pro CHS] Já se v tomhle totiž vůbec neorientuju :-(.

Jinak díky za pomoc.

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Pauli.9 - uživatel již zaslal 51 příspěvků (IP uloženo)
Datum: 04. 08. 2009 10:27

prosim, prosim, prosim ....

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Neregistrovaný uživatel: kvadroid (IP uloženo)
Datum: 04. 08. 2009 20:36

to ses pořád nedostal k tomuhle? asi to plánuješ na desítky let

MOV AH,42H ; funkce pro čtení dat LBA
MOV DL,80H ; disk
MOV SI, LBA
MOV WORD [Adr+2],ES
MOV WORD [Adr],BX
INT 13H
NOP ; prázdná instrukce

LBA: ; struktura LBA paketu
VelPack DB 10H ; velikost paketu
Rez DB 00H ; rezervováno
VelBlk DW 0001H ; velikost bloku k přenosu
Adr DD 00000000H ; cílová adresa buferu
Pozice DQ 000000000009D5BFH ; hodnota LBA32
AdrEMS DQ 0H

druha moznost pro otestování zápisu nad prostor ohranicenej 1MB zde nejdriv pod 1MB : - )
LBA: ; struktura LBA paketu
VelPack DB 10H ; velikost paketu
Rez DB 00H ; rezervováno
VelBlk DW 0001H ; velikost bloku k přenosu
Adr DD 0ffffffffH ; cílová adresa buferu
Pozice DQ 01H ; hodnota LBA32
AdrEMS DQ 0080000000000000h ; adresa rozšířené paměti *4

Re: boot loader - předávání dat mezi RAM a diskem
Vloženo uživatelem: Pauli.9 - uživatel již zaslal 51 příspěvků (IP uloženo)
Datum: 04. 08. 2009 21:29

Díky díky díky moc.



Vaše jméno: 
Váš e-mail: 
Předmět: 

:-)  :-(  ;)  :D  :S  spatne  dobre  bold  italic  email  citace  odkaz  obrazek 
Antispam ochrana u neregistrovaných uživatelů - opište čísla z obrázku:
  

Toto fórum je provozováno také jako emailová konference s e-mailovou adresou asm [a] builder.cz.
Podrobný návod jak se k odběru zpráv e-mailem přihlásit naleznete v tomto návodu.




  



Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost.

info@builder.cz
Vydává Grafika Publishing, s.r.o.
Copyright (c) 1997-2005 Všechna práva vyhrazena
Pro diskuzní fóra využíváme software z phorum.org