Bin file generálása C/asm kódból, bootolás
2015-04-11T10:17:13+02:00
2015-04-12T12:45:30+02:00
2022-08-09T13:15:30+02:00
Markhazy
16 bites valós mód; a lemez bootsektorában lévő ,loader az első szektortól kezdve felmásol a memóriába a lemezről 64kb futtatható kódot, majd a felmásolt program kezdőcímére átadja a vezérlést. Ez a kezdőcím 0060h : 0000 [SEG:OFF]

Eddig NASM ban írtam ide programokat, de elég nagy meló lesz így befejezni ezt a projektet. Nem akarom Assemblyben lekódolni az egészet. Utánanéztem C fordítók után amelyek képesek 16 bites valós módú kódot generálni. Találtam is open-watcom-c-win32-1.9.

Az elképzelés az lenne hogy C ben inline assemblyvel megírom a programot és Ezzel a környezettel fordítva, a bin-t felmásolom a lemezre.

2 napja próbálom ezt az egyszerű C forrást lefordítani majd a  WatCom exe2bin programjával konvertálni .bin be. Ami működik is és generál futtatható programot is, meg com ot is. Ezek le is futnak Win alatt de a lemezre másolva már nem mennek.

void main() { __asm { mov ah, 0Eh mov al, '!' int 10h } }


Több problémát tartok lehetségesnek. Például nem tudom hogy hogyan lehetne beállítani a C forrás, vagy a linkelésnél a seg:off értékeket mert talán itt csúszik el a dolog.

Egy olyan bin filet kellene előállítani ami Tiny memóriamodellt használ, és a lemezre másolva vezérlésátadás után lefut. Tehát elég csak call al ugrani a kezdőcímre.

Van valakinek ilyen tapasztalata? Esetleg milyen környezettel tudom ezt megcsinálni ha nem WatCom al?

Hálásan köszönöm a segítséget!
Mutasd a teljes hozzászólást!
wcc -0 -d0 -ml -s -wx -zl xyxy.c
wlink FILE xyxy.obj FORMAT RAW BIN NAME xyxy.bin OPTION NODEFAULTLIBS, START=amit megadsz_

De ha jól emlékszem kell a DOS mode is (cross-compiling)
Mutasd a teljes hozzászólást!

  • Ezek le is futnak Win alatt de a lemezre másolva már nem mennek.

    Ennek valószínű, hogy leginkább az az oka, hogy a lefordított kód nagy valószínűséggel támaszkodik a DOS sajátosságaira (pl. PSP, int 0x20, int 0x21 stb.) és mivel a DOS az általad leírt folyamatban sehol nem kapott helyet, ezért nem is működik.
    Egyébként nem igazán értem a koncepciódat és a végső célt sem. Amennyiben az alkalmazás nem túl bonyolult, akkor annak assembly-ben történő megírása sem jelent akkora kihívást, hogy C-ben kelljen lekódolni. Ha pedig igen, akkor a DOS kernelét (ld. pl. io.sys és msdos.sys) minek is kihagyni. Ez utóbbi esetben a parancsértelmezőnek megadhatod a te saját kis programodat (ld. config.sys). Természetesen ilyenkor nincs szükséged command.com-ra és a többi kiegészítő szolgáltatásra...
    Mutasd a teljes hozzászólást!
  • Talán segíthet: Writing a boot loader in Assembly and C (ld. a cikk utolsó harmadát!).
    Mutasd a teljes hozzászólást!
  • Csatlakozok.i
    Az ASM két fontos blokkhoz nélkülözhetetlen, onnan lehet C vagy akár C++  is.

    A boot loader ugye ASM, ezzel egy kis programot írhatsz, ami képes a lemez (vagy akármilyen eszköz, pl. memóriakártya) egy dedikált területéről [*] a memória egy dedikált területére áttölteni bináris tartalmat.
    Ezt a tartalmat is érdemes ASM-ben írni. 
    És ebbe egy program loadert írni. Ami már a C tárgykódját is tudja megfelelő címre fordítva beolvastatni, akár egyszerű filerendszerből is.
    Innen már egy moduláris oprendszer kezdetéhez jutsz.

    [*] ugye ekkor még nincs filerendszered (illetve a filerendszerben fixálni kell ezt a területet).
    Mutasd a teljes hozzászólást!
  • A pontot csörnyeföldinek adtam mivel lógok neki 50 ponttal egy másik téma miatt, de azt bezárattam idő előtt.

    FBS, ez lesz a járandó út úgy érzem.
    Mutasd a teljes hozzászólást!
abcd