【问题标题】:Running code at memory location in my OS在我的操作系统的内存位置运行代码
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 谢谢,有时间我试试。我忘了看wiki.osdev.org/Memory_Map_(x86)。我在屏幕上看到了那个文字,你在0x8000 上看到了吗?
  • 是的,我在这个测试中使用了 0x8000。
  • 谢谢,我现在开始工作了!还有一件事,我可以使用 call 代替 jmp,并在 bin 中使用 ret 吗?
  • 暂时是的。将来您可能需要exit 系统调用。
  • 退出系统调用是什么意思,你的意思是告诉系统停止程序执行而不是手动执行?在 ret 期间/之后进行调用和 ret 会导致页面错误...
猜你喜欢
  • 2011-09-13
  • 2020-09-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多