Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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
如何使用汇编(NASM)引导加载程序编译Rust内核_Rust_Operating System_Kernel_Bootloader_Rust Cargo - Fatal编程技术网

如何使用汇编(NASM)引导加载程序编译Rust内核

如何使用汇编(NASM)引导加载程序编译Rust内核,rust,operating-system,kernel,bootloader,rust-cargo,Rust,Operating System,Kernel,Bootloader,Rust Cargo,我有一个用NASM编写的简单的两阶段引导加载程序,我想使用Rust继续操作系统内核 所以我用Cargo创建了一个夜间生锈项目,并在src/main.rs文件中禁用了std。现在我正在尝试将程序集文件与Cargo项目链接,但没有成功 我应该如何编译NASM引导加载程序并将其与Rust内核链接?几个小时后,我编译了代码 解决方案是(就像Michael Petch建议的那样),将汇编代码编译成静态.o文件,然后使用xargo和自定义目标编译rust代码。我将Rust代码编译为一个静态库,而不是二进制文

我有一个用NASM编写的简单的两阶段引导加载程序,我想使用Rust继续操作系统内核

所以我用Cargo创建了一个夜间生锈项目,并在src/main.rs文件中禁用了std。现在我正在尝试将程序集文件与Cargo项目链接,但没有成功


我应该如何编译NASM引导加载程序并将其与Rust内核链接?

几个小时后,我编译了代码

解决方案是(就像Michael Petch建议的那样),将汇编代码编译成静态
.o
文件,然后使用
xargo
和自定义目标编译rust代码。我将Rust代码编译为一个静态库,而不是二进制文件,因此输出是一个
.a
对象文件,而不是一个可执行文件


然后,我使用带有链接器脚本的
gcc
将对象文件链接在一起,并将结果输出为ELF文件。之后,我使用
objcopy
to和
-O binary
标志将ELF文件复制到.bin文件。最后,我使用
dd
创建了一个映像文件,可以从中启动。

几个小时后,我编译了代码

解决方案是(就像Michael Petch建议的那样),将汇编代码编译成静态
.o
文件,然后使用
xargo
和自定义目标编译rust代码。我将Rust代码编译为一个静态库,而不是二进制文件,因此输出是一个
.a
对象文件,而不是一个可执行文件


然后,我使用带有链接器脚本的
gcc
将对象文件链接在一起,并将结果输出为ELF文件。之后,我使用
objcopy
to和
-O binary
标志将ELF文件复制到.bin文件。最后,我使用
dd
创建了一个映像文件,我可以从中启动。

不要将它们链接在一起。将rust对象的链接输出到二进制文件(我不使用rust,但可以使用
objcopy
转换elf可执行文件(由rust生成)二进制文件。将二进制文件放在引导加载程序将从中读取扇区的磁盘上。您可以使用
dd
执行此操作。似乎有一个
bootmimage
Rust项目来创建一个包含Rust ELF可执行文件的可引导磁盘映像。哎呀,到bootmimage项目的链接在这里:据我所知,bootmimageRust project只用于使用预先存在的引导加载器编译内核。我有自己的引导加载器,因此我认为这不是解决方案。然后,您必须使用我在第一篇文章中建议的内容。您的项目可能正在生成ELF可执行文件。使用
objcopy
将ELF可执行文件转换为二进制文件。使用so转换它方法类似于
objcopy-O binary myos.elf myos.bin
,然后您可以使用
dd
将引导加载程序放置在第一个扇区中,并将
myos.bin
(或您希望的任何名称)放置在后面的扇区中。您可以使用
cat boot.bin myos.bin>disk.img
(或者类似的事情,如果操作系统预期从引导加载程序之后的磁盘加载,并且假设boot.bin正好是512字节)不要将它们链接在一起。将rust对象的链接输出到二进制文件(我不使用rust,但您可以使用
objcopy
转换elf可执行文件(由rust生成)二进制文件。将二进制文件放在引导加载程序将从中读取扇区的磁盘上。您可以使用
dd
执行此操作。似乎有一个
bootmimage
Rust项目来创建一个包含Rust ELF可执行文件的可引导磁盘映像。哎呀,到bootmimage项目的链接在这里:据我所知,bootmimageRust project只用于使用预先存在的引导加载器编译内核。我有自己的引导加载器,因此我认为这不是解决方案。然后,您必须使用我在第一篇文章中建议的内容。您的项目可能正在生成ELF可执行文件。使用
objcopy
将ELF可执行文件转换为二进制文件。使用so转换它方法类似于
objcopy-O binary myos.elf myos.bin
,然后您可以使用
dd
将引导加载程序放置在第一个扇区中,并将
myos.bin
(或您希望的任何名称)放置在后面的扇区中。您可以使用
cat boot.bin myos.bin>disk.img
(如果预期操作系统将从引导加载程序之后的磁盘上加载,并且假定boot.bin正好是512字节,则为类似情况)