关于macOS上尝试编译运行DragonOS遇到的一系列问题

编译环境为M1pro芯片的macOS Sonoma14.2.1,架构为ARM64,riscv64版本为riscv64-unknown-elf-gcc13.2.0
首先ARCH选择了riscv64,将脚本中一系列linux独有的命令修改为适应macOS的命令后还是遇到了问题。

首先尝试直接运行make run:
报错为:


之后还出现了类似的报错,例如:

以及有版本match问题:


最后还提醒我缺少了一个crate?

尝试解决这些问题无果后,我在运行了docker的环境下尝试运行make run-docker,结果在安装riscv64版本的grub时遇到这个报错:


我自己修改后安装grub的脚本如下


# 检测当前 Shell 类型
if [ -n "$ZSH_VERSION" ]; then
  CURRENT_SHELL=zsh
elif [ -n "$BASH_VERSION" ]; then
  CURRENT_SHELL=bash
elif [ -n "$KSH_VERSION" ]; then
  CURRENT_SHELL=ksh
elif [ -n "$FCEDIT" ]; then
  CURRENT_SHELL=ksh
elif [ -n "$PS3" ]; then
  CURRENT_SHELL=unknown
else
  CURRENT_SHELL=sh
fi

# 在 macOS 上,默认情况下,系统使用 Bash shell
source "$HOME/.${CURRENT_SHELL}rc"

ABS_PREFIX=/opt/dragonos-grub
grub_dir_i386_efi=${ABS_PREFIX}/arch/i386/efi/grub
grub_dir_i386_legacy=${ABS_PREFIX}/arch/i386/legacy/grub
grub_dir_x86_64_efi=${ABS_PREFIX}/arch/x86_64/efi/grub
grub_dir_riscv64_efi=${ABS_PREFIX}/arch/riscv64/efi/grub

# 创建目录
sudo mkdir -p ${grub_dir_i386_efi}
sudo mkdir -p ${grub_dir_i386_legacy}
sudo mkdir -p ${grub_dir_x86_64_efi}
sudo mkdir -p ${grub_dir_riscv64_efi}

# 检查是否已安装 Grub
if [ -d ${grub_dir_i386_efi}/bin ] && [ -d ${grub_dir_i386_legacy}/bin ] && [ -d ${grub_dir_x86_64_efi}/bin ] && [ -d ${grub_dir_riscv64_efi}/bin ]; then
    exit 0
fi

# 准备编译环境
xcode-select --install

# 下载 Grub 2.06
if [ ! -f "grub-2.06.tar.xz" ]; then
    echo "正在下载 Grub 2.06"
    curl -LO https://mirrors.ustc.edu.cn/gnu/grub/grub-2.06.tar.xz || exit 1
    echo "下载完成"
fi

tar xvf grub-2.06.tar.xz
cd grub-2.06

# 安装依赖
brew install make bison gettext gawk

echo "开始编译安装 Grub 2.06"

# 如果不存在 riscv64_efi 的 Grub,则编译安装
if [ ! -d ${grub_dir_riscv64_efi}/bin ]; then
    echo "开始编译安装 riscv64_efi 版本的 Grub"
    ./configure --host=riscv64-unknown-elf-gcc --target=riscv64 --with-platform=efi --prefix=${grub_dir_riscv64_efi} --disable-werror || exit 1
    make -j $(sysctl -n hw.logicalcpu) || exit 1
    sudo make install || exit 1
    make clean || exit 1
    sudo chmod -R 777 ${grub_dir_riscv64_efi}
fi

cd ..

rm -rf grub-2.06
rm grub-2.06.tar.xz*
echo "Grub 2.06 安装完成"

google只看到了08年有人在Linux环境下遇到了同样的问题且对方给出的解决方案里需要修改的变量我这边没有找到…

有前辈能帮忙看看吗TT

riscv下的编译可以参考视频的5:29开始的部分。

【【教程06】内核调试黑魔法:对QEMU自身进行调试,从而定位DragonOS问题】 【精准空降到 05:29】 【教程06】内核调试黑魔法:对QEMU自身进行调试,从而定位DragonOS问题_哔哩哔哩_bilibili

感谢!跟随视频的步骤解决了大部分的报错,但是仍然有一个版本不匹配问题并且会echo内核编译失败:


是我有什么config忘改了吗?

1 个赞

你的那个crates-io镜像源不要使用dragonos-gitee的哈

请问crates-io还有其他的镜像源吗TT我在官网没有看到,刚刚尝试把~/.cargo/config里的配置直接清空了,结果报错变成了无法找到riscv的版本了

运行tools/change_rust_src.sh

修改镜像源后再次尝试编译还是指出riscv版本不对,我尝试修改了cargo.toml中对应的包版本号后编译器指出是需要我的riscv拥有s-mode特性:


我的riscv toolchain是使用brew install riscv-tools安装的,网上查了一下这个s-mode似乎是riscv的一种模式并不是特性,并且好像无法人为启动只能在程序内部通过函数调用打开?

看看你的cargo的config

这是DragonOS/kernel/.cargo/config.toml的内容:

# build-std = ["core", "compiler_builtins", "alloc"]
# build-std-features = ["compiler-builtins-mem"]

[target.'cfg(target_os = "none")']
runner = "bootimage runner"

[env]

~/.cargo/config里的内容就是更换镜像源的脚本echo进去的:

 registry = "https://github.com/rust-lang/crates.io-index"

 replace-with = 'tuna'
 [source.tuna]
 registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"```

话说你其实可以试一下用x86_64的版本,riscv架构还在开发中,用户程序什么的都还是写不了的

好的;;其实我在arm64架构的Debian虚拟机上尝试过也编译不了……感觉arm64架构还是会有一些问题?我先试试换成x86架构的Ubuntu,感谢!