Search code examples
gccassemblyx86nasmosdev

Running code at memory location in my OS


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.


Solution

  • 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