如何使用汇编(NASM)引导加载程序编译Rust内核
我有一个用NASM编写的简单的两阶段引导加载程序,我想使用Rust继续操作系统内核 所以我用Cargo创建了一个夜间生锈项目,并在src/main.rs文件中禁用了std。现在我正在尝试将程序集文件与Cargo项目链接,但没有成功如何使用汇编(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内核链接?几个小时后,我编译了代码 解决方案是(就像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字节,则为类似情况)