Pregunta

I am developing an OS in C (and some assembly of course) and now I want to allow it to load/run external (placed in the RAM-disk) programs. I have assembled a test program as raw machine code with nasm using '-f bin'. Everything else i found on the subject is loading code while running Windows or Linux. I load the program into memory using the following code:

#define BIN_ADDR 0xFF000
int run_bin(char *file) //Too many hacks at the moment
{
    u32int size = 0;
    char *bin = open_file(file, &size);
    printf("Loaded [%d] bytes of [%s] into [%X]\n", size, file, bin);
    char *reloc = (char *)BIN_ADDR; //no malloc because of the org statement in the prog
    memset(reloc, 0, size);
    memcpy(reloc, bin, size);
    jmp_to_bin();
}

and the code to jump to it:

[global jmp_to_bin]
jmp_to_bin:
    jmp [bin_loc] ;also tried a plain jump

bin_loc dd 0xFF000

This caused a GPF when I ran it. I could give you the registers at the GPF and/or a screenshot if needed.

Code for my OS is at https://github.com/farlepet/retro-os

Any help would be greatly appreciated.

¿Fue útil?

Solución

You use identity mapping and flat memory space, hence address 0xff000 is gonna be in the BIOS ROM range. No wonder you can't copy stuff there. Better change that address ;)

bochs screenshot

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top