Hallo zusammen,
nachdem ich meinen Floppy / Fat Treiber fertig hatte, wollte ich jetzt auch mal Dateien in laden und starten. In Teil 8 des Tutorials, wurde ein ELF-Loader erklärt. Den habe ich auch funktionsfähig (zumindest bei von GRUB übergebenen Modulen) implementiert. Jetzt habe ich vor, die Daten, die ich von der Floppy gelesen habe, als ELF zu starten.
Das Problem ist, dass ich bekomme, wenn ich die ELF Datei starte, einen Invalid Opcode bekomme.
char app[size]; //Speicher reservieren
kmemset((void*) &app[0], 0x0, size);//Speicher zu sicherheit putze
readFile( f, size, &app[0] ); //Von der Floppy einlesen
char *appP = &app[0]; //Sonst funktioniert es nicht....
initELF( (void*) appP, 20); //ELF Datei laden
Dazu der ELF Loader:
void *initELF(void* image, int pri)
{
/*
* FIXME Wir muessen eigentlich die Laenge vom Image pruefen, damit wir bei
* korrupten ELF-Dateien nicht ueber das Dateiende hinauslesen.
*/
struct elf_header* header = image;
struct elf_program_header* ph;
int i;
/* Ist es ueberhaupt eine ELF-Datei? */
if (header->magic != ELF_MAGIC) {
kprintf("Keine gueltige ELF-Magic!\n");
return 0;
}
/*
* Alle Program Header durchgehen und den Speicher an die passende Stelle
* kopieren.
*
* FIXME Wir erlauben der ELF-Datei hier, jeden beliebigen Speicher zu
* ueberschreiben, einschliesslich dem Kernel selbst.
*/
ph = (struct elf_program_header*) (((char*) image) + header->ph_offset);
for (i = 0; i < 2/*header->ph_entry_count*/; i++, ph++) {
void* dest = (void*) ph->virt_addr;
void* src = ((char*) image) + ph->offset;
/* Nur Program Header vom Typ LOAD laden */
if (ph->type != 1) {
continue;
}
kmemset(dest, 0, ph->mem_size);
kmemcpy(dest, src, ph->file_size);
}
initTask( (void *)header->entry, pri);
return (void*) header->entry;
}
Ich musste
header->ph_entry_count
gegen 2 austauschen, weil der Wert bei ungefähr 30 000 liegt.
Die ELF Datei lädt er auch, aber sobald ich einen Syscall von dem ausgeführten Programm aufrufe, geschieht der Invalid Opcode.
Hat einer von euch eine Idee?
S.