【发布时间】:2012-12-27 07:32:47
【问题描述】:
我正在用 C 语言开发一个操作系统(当然还有一些程序集),现在我想让它加载/运行外部(放置在 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
任何帮助将不胜感激。
【问题讨论】:
-
这是 16 位代码吗?您对
far的使用表明它可能是。如果是这种情况,那么地址FF000在 16 位域中无效。 -
如果这是真正的代码,那么变量
bin永远不会被初始化。因此,memcpy很可能只是复制垃圾。 -
哦,far 只能用在 16 位码中?这是 32 位的,所以
0xFF000是有效的。但我确实在没有far的情况下尝试过,它仍然发出了 GPF。 -
Codo: bin 在函数 open_file 中初始化,它是 malloc'd 然后文件被复制到它
-
函数
open_file()不能改变调用函数中bin的值(因为指针是按值传递的)。这几乎肯定是这里的问题之一。
标签: gcc assembly x86 nasm osdev