在我的操作系统中的内存位置运行代码

时间:2012-12-27 07:32:47

标签: c assembly osdev

我正在用C开发一个OS(当然还有一些程序集),现在我想让它加载/运行外部(放在RAM磁盘中)程序。我使用'-f bin'组装了一个测试程序作为原始机器代码与nasm。我在该主题上找到的所有其他内容都是在运行Windows或Linux时加载代码。我使用以下代码将程序加载到内存中:

#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();
}

以及跳转到它的代码:

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

bin_loc dd 0xFF000

我运行它时会导致GPF。如果需要,我可以在GPF上给你注册和/或截图。

我的操作系统代码位于https://github.com/farlepet/retro-os

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您使用身份映射和平面内存空间,因此地址0xff000将在BIOS ROM范围内。难怪你不能复制那里的东西。更好地改变那个地址;)

bochs screenshot