PDA

View Full Version : Bootloader con Bochs


Unrue
07-12-2005, 16:18
Ho scritto un piccolo bootloader che carica un kernel, il quale scrive un semplice messaggio a video. Ora, so che il bootloader deve stare nel primo settore del floppy, ed il kernel in quelli successivi. Inanzitutto, il kernel l'ho scritto in c++, compilato con il C++BuilderX. Il bootloader è in assembler e compilato con il Nasm. Credo che la procedura giusta sia inserire nel floppy prima il botloader e poi il kernel compilato, inserendo quindi il file con estensione obj. Vorrei fare il tutto con rawrite, ma non so come creare un'immagine del disco partendo da questi due file. Il tutto poi partirebbe in simulazione con il Bochs. Vi allego il kernel in c++, cosi' se c'è qualche errore potete dirmelo:

char *videomem = (char *) 0xb8000; /*da dove inizia la memoria della scheda video*/

void putc(char carattere){
*videomem++ = carattere; /*imposto il carattere*/
*videomem++ = 0x7; /*imposto gli attributi del carattere*/
}

void putstring(char *stringa){
int i = 0;
while(stringa[i]){
putc(stringa[i]);
i++;
}
}

void _start() {
putstring("Ciao ");
}

DanieleC88
07-12-2005, 16:56
C++ BuilderX? ...ehm, assicurati di aver create un eseguibile binario... ;)

Unrue
07-12-2005, 17:00
C++ BuilderX? ...ehm, assicurati di aver create un eseguibile binario... ;)

Non lo crea il C++builder? Pensavo fosse il file con estensione obj. :stordita:

DanieleC88
08-12-2005, 09:19
Non so se il C++ Builder lo fa. Assicurati comunque di generare un "flat executable". ;)

Unrue
08-12-2005, 13:02
Non so se il C++ Builder lo fa. Assicurati comunque di generare un "flat executable". ;)

Ok,provero'. Per gli altri miei dubbi sai aiutarmi? Grazie. :)

DanieleC88
09-12-2005, 09:52
Ok,provero'. Per gli altri miei dubbi sai aiutarmi? Grazie. :)
Per gli altri dubbi ti rispondo qui dettagliatamente, se vuoi altri chiarimenti contattami su ICQ o MSN. :)

Inannanzitutto: scrivere un bootloader non è facile. Bisogna rispettare dei precisi limiti (deve entrare tutto in un solo settore, quindi deve essere grande precisamente 512 byte e deve terminare con due byte, 0x55 e 0xAA) per farlo riconoscere al BIOS.
Quindi: assicurati che il bootloader sia grande 512 byte e termini con 0xAA55, poi crea un singolo file che faccia da "immagine" per il floppy (visto che usi Rawrite e C++ Builder credo tu stia usando Windows :D, quindi: "COPY LOADER+KERNEL IMMAGINE.BIN") e poi usa Rawrite per scriverlo su floppy. Puoi testarlo direttamente riavviando il computer, ma farlo spesso ti toglie parecchio tempo, quindi meglio se usi una virtual machine per testare il kernel. ;)

71104
09-12-2005, 13:41
daniele, lui voleva semplicemente sapere come fare a creare un file contenente un'immagine "raw" del floppy da scrivere poi direttamente con rawrite ;)
unrue, per farlo puoi semplicemente scrivere un programma che:
1) apra il file del bootloader
2) lo ricopi tale e quale nel file di destinazione (quello che conterrà l'immagine del floppy da scrivere con rawrite)
3) scriva il kernel nel file di destinazione subito dopo il primo settore
una volta fatto questo e riuscito a caricare il kernel col tuo bootloader, scoprirai che un file COFF a 32 bit non corrisponde esattamente a un binario puro... :D
buon lavoro ;)

DanieleC88
09-12-2005, 14:58
daniele, lui voleva semplicemente sapere come fare a creare un file contenente un'immagine "raw" del floppy da scrivere poi direttamente con rawrite ;)
Eh, lo so. E non ti pare più facile il mio metodo ("COPY LOADER+KERNEL IMMAGINE.BIN", un banalissimo comando DOS) piuttosto che scriverti del codice apposta? :D

ciao ;)