我找到了一个简单内核加载程序的示例,并试图了解它的工作原理。但由于错误,我甚至无法构建它:
loader.s:5:20: error: unexpected token in '.section' directive
.section .multiboot
^
loader.s:11:15: error: unexpected token in '.section' directive
.section .text
^
loader.s:28:1: error: unknown directive
.sectio .bss 以下是加载程序代码:
.set MAGIC, 0x1badb002
.set FLAGS, (1<<0 | 1<<1)
.set CHECKSUM, -(MAGIC + FLAGS)
.section .multiboot
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .text
.extern main
.extern callConstructors
.global loader
loader:
mov $kernel_stack, %esp
call callConstructors
push %eax
push %ebx
call main
_stop:
cli
hlt
jmp _stop
.sectio .bss
.space 2*1024*1024;
kernel_stack:我将其编译为as -m32 loader.s。
搜索后,我发现我不需要将.section与.text和.bss结合使用,但我不知道.multiboot部分是什么,也不知道如何修复这个错误。我在谷歌上找不到关于.multiboot的信息。
P.S.如果我用MacOS很重要的话。
发布于 2020-06-29 02:04:43
如果这很重要,我用MacOS。
这就是其中的一部分。想必您的as实际上是针对主机的默认Apple (LLVM)汇编程序(check as --version)。这段代码是用https://wiki.osdev.org/Bare_Bones#Building_a_Cross-Compiler编写的。该代码假设您是在一个i 686-精灵交叉编译器下运行的。我认为LLVM和GCC汇编程序是可互换的,但是指令取决于您的输出目标。对于您来说,默认情况下,OSX上的as/clang/whatever假设您正在为您的主机进行编译,我认为它不使用ELF输出目标。通过-target i686-elf应该可以做到这一点。
尽管如此,如果您正在推进更丰富的OS/内核开发,那么就需要好理由来构建一个真正的交叉编译器。将一堆标志传递给您的主机编译器,以迫使它进行交叉编译,可能会使您陷入困境。
编辑:我发现了你的问题,因为我试图在我的Macbook上设置一个OS环境。如果您正在构建一个多引导内核,那么您最终将需要将上面的代码片段与真正的内核连接起来,可能需要使用链接器脚本。不幸的是,我刚刚发现苹果的ld不接受GCC风格的链接器脚本(来自LLVM的真正的ld,所以这是苹果的特性),所以我放弃了,只想在我的机器上构建GCC。我推荐那条路!
https://stackoverflow.com/questions/59799671
复制相似问题