Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 在我的操作系统中的内存位置运行代码_Gcc_Assembly_X86_Nasm_Osdev - Fatal编程技术网

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

Gcc 在我的操作系统中的内存位置运行代码,gcc,assembly,x86,nasm,osdev,Gcc,Assembly,X86,Nasm,Osdev,我正在用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;

我正在用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的注册表和/或屏幕截图

我的操作系统的代码位于


非常感谢您的帮助。

您使用标识映射和平坦内存空间,因此地址0xff000将在BIOS ROM范围内。难怪你不能在那里复制东西。最好换个地址;)


您使用标识映射和平坦内存空间,因此地址0xff000将在BIOS ROM范围内。难怪你不能在那里复制东西。最好换个地址;)



这是16位代码吗?您使用的
far
表明它可能是。如果是这种情况,则地址
FF000
在16位land中无效。如果这是实代码,则变量
bin
永远不会初始化。因此,
memcpy
很可能只是复制垃圾。哦,far只能在16位代码中使用?这是32位,因此
0xFF000
有效。但是我确实在没有
far
的情况下尝试了它,它仍然发出了一个GPF。Codo:bin在函数open_file中初始化,它是malloc'd,然后文件被复制到它。函数
open_file()
无法更改调用函数中
bin
的值(因为指针是按值传递的)。这几乎肯定是这里的问题之一。这是16位代码吗?您使用的
far
表明它可能是。如果是这种情况,则地址
FF000
在16位land中无效。如果这是实代码,则变量
bin
永远不会初始化。因此,
memcpy
很可能只是复制垃圾。哦,far只能在16位代码中使用?这是32位,因此
0xFF000
有效。但是我确实在没有
far
的情况下尝试了它,它仍然发出了一个GPF。Codo:bin在函数open_file中初始化,它是malloc'd,然后文件被复制到它。函数
open_file()
无法更改调用函数中
bin
的值(因为指针是按值传递的)。这几乎肯定是这里的问题之一。谢谢,等我有时间我会试试的。我忘了看电视了。我在屏幕上看到了这个文本,你在
0x8000
下工作了吗?是的,我在这个测试中使用了0x8000。谢谢,我现在工作了!还有一件事,我可以使用call而不是jmp,并在bin中使用ret吗?暂时可以。将来,您可能需要退出系统调用。退出系统调用是什么意思,您的意思是告诉系统停止程序执行,而不是手动执行?打电话和ret会在ret期间/之后导致页面错误…谢谢,我有时间会试试。我忘了看电视了。我在屏幕上看到了这个文本,你在
0x8000
下工作了吗?是的,我在这个测试中使用了0x8000。谢谢,我现在工作了!还有一件事,我可以使用call而不是jmp,并在bin中使用ret吗?暂时可以。将来,您可能需要退出系统调用。退出系统调用是什么意思,您的意思是告诉系统停止程序执行,而不是手动执行?执行呼叫和ret会在ret期间/之后导致页面错误。。。