Ubuntu以外でもMikanOSを動かしたい
発売されましたね。
さて、「ゼロからのOS自作入門」は想定環境をUbuntuとしていますが、自分のラップトップがArchLinuxなので、これは困った。 ということで何とかして動かしてみます。
標準ライブラリをビルドする
まずは以下のリポジトリをクローンします。
MikanOSの標準ライブラリはどうやら devenv_src/stdlib/build.sh
でビルドできるようです。
mikanos-build/build.sh at master · uchan-nos/mikanos-build · GitHub
リポジトリから大事な部分を引用します。
exe docker cp ${CID}:/usr/local/x86_64-elf ${HOME}/osbook/devenv SRC=/usr/local/src DST=${HOME}/osbook/devenv/x86_64-elf exe docker cp ${CID}:${SRC}/newlib-cygwin/COPYING.NEWLIB ${DST}/LICENSE.newlib exe docker cp ${CID}:${SRC}/llvm-project/libcxx/LICENSE.TXT ${DST}/LICENSE.libcxx exe docker cp ${CID}:${SRC}/freetype-2.10.1/docs/FTL.TXT ${DST}/LICENSE.freetype echo "" echo "Done. Standard libraries at ${HOME}/osbook/devenv/x86_64-elf"
Docker内部でビルドした成果物を ${HOME}/osbook/devenv
にコピーしているので、この部分を書き換えればよさそうです。
こんな感じに書き換え。
exe docker cp ${CID}:/usr/local/x86_64-elf /path/to/mikanos_third_party SRC=/usr/local/src DST=/path/to/mikanos_third_party/x86_64-elf exe docker cp ${CID}:${SRC}/newlib-cygwin/COPYING.NEWLIB ${DST}/LICENSE.newlib exe docker cp ${CID}:${SRC}/llvm-project/libcxx/LICENSE.TXT ${DST}/LICENSE.libcxx exe docker cp ${CID}:${SRC}/freetype-2.10.1/docs/FTL.TXT ${DST}/LICENSE.freetype echo "" echo "Done. Standard libraries at /path/to/mikanos_third_party/x86_64-elf"
こうすると /path/to/mikanos_third_party/x86_64-elf
に成果物ができている、はずです。
mikanos-buildの各種スクリプトを書き換える
次はmikanos-buildに含まれるmikanosのビルドスクリプトを書き換えます。
buildenv.sh
mikanos-build/buildenv.sh at master · uchan-nos/mikanos-build · GitHub
BASEDIR
を書き換えればよさそうです。
こんな感じ。
# Usage: source buildenv.sh BASEDIR="/path/to/mikanos_third_party/x86_64-elf" export CPPFLAGS="-I$BASEDIR/include/c++/v1 -I$BASEDIR/include -I$BASEDIR/include/freetype2 -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE -D_POSIX_TIMERS" export LDFLAGS="-L$BASEDIR/lib"
make_mikanos_image.sh
mikanos-build/make_mikanos_image.sh at master · uchan-nos/mikanos-build · GitHub
edk2のパスに合わせて LOADER_EFI
を書き換えます。
edk2は適当な場所にクローンして、 git submodule update --init
をしておくとよい。
#!/bin/sh -ex DEVENV_DIR=$(dirname "$0") MOUNT_POINT=./mnt if [ "$DISK_IMG" = "" ] then DISK_IMG=./mikanos.img fi if [ "$MIKANOS_DIR" = "" ] then if [ $# -lt 1 ] then echo "Usage: $0 <day>" exit 1 fi MIKANOS_DIR="$HOME/osbook/$1" fi LOADER_EFI="/path/to/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi" KERNEL_ELF="$MIKANOS_DIR/kernel/kernel.elf" $DEVENV_DIR/make_image.sh $DISK_IMG $MOUNT_POINT $LOADER_EFI $KERNEL_ELF $DEVENV_DIR/mount_image.sh $DISK_IMG $MOUNT_POINT . . .
mikanos本体の build.sh
最後にmikanos本体の build.sh
を書き換えます。
mikanos/build.sh at master · uchan-nos/mikanos · GitHub
${HOME}/osbook/...
となっている部分をmikanos-buildをクローンしたパスに書き換えます。
#!/bin/sh -eu make ${MAKE_OPTS:-} -C kernel kernel.elf for MK in $(ls apps/*/Makefile) do APP_DIR=$(dirname $MK) APP=$(basename $APP_DIR) make ${MAKE_OPTS:-} -C $APP_DIR $APP done DISK_IMG=./disk.img MIKANOS_DIR=$PWD /path/to/mikanos-build/devenv/make_mikanos_image.sh if [ "${1:-}" = "run" ] then /path/to/mikanos-build/devenv/run_image.sh ./disk.img fi
起動
以上のことをして、mikanosのosbook_day30fのルートディレクトリで
APPS_DIR=apps RESOURCE_DIR=resource ./build.sh run
で動作する(はず)。