無限遠まで突撃中

ネット日記書きの徒然。

Ubuntu以外でもMikanOSを動かしたい

ゼロからのOS自作入門

ゼロからのOS自作入門

発売されましたね。

さて、「ゼロからのOS自作入門」は想定環境をUbuntuとしていますが、自分のラップトップがArchLinuxなので、これは困った。 ということで何とかして動かしてみます。

標準ライブラリをビルドする

まずは以下のリポジトリをクローンします。

github.com

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

で動作する(はず)。