|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
![]() |
||||||||||
|
|
|||||||||
Diskuzní forum: AssemblerTé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: 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 !!!
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: 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. Toto fórum je provozováno také jako emailová konference s e-mailovou adresou asm [a] builder.cz. Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost. |