Mac + Dockerで「ゼロからのOS自作入門」の環境構築を実装する

Mac + Dockerで「ゼロからのOS自作入門」の環境構築を実装します.

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# Mac + Dockerでの環境構築

Docker ではじめる "ゼロからのOS自作入門" (opens new window)に従い,VS Code Remote Container(devcontainer)を使用します.

VS Code Remote ContainerはVS code上でDockerのコンテナを使用する機能です.

仕組みとしては,環境と実行はDockerで,動作確認はローカルのXQuartzに表示させて実行します.

# XQuartz

ここでは,DockerとVS Codeのインストールは省略します.

以下のコマンドでXQuartzのインストールを実行します.

XQuartzは「/アプリケーション/ユーティリティ」ディレクトリにあるXQuartzをダブルクリックして起動します.

# XQuartzのインストール
brew install xquartz

XQuartzが起動すると下記のようなターミナルが表示されます.表示されない場合は,上部メニューの「アプリケーション -> ターミナル」で表示できます.

XQuartzのターミナル上で,下記のコードを実行したら準備OKです.

xhost + 127.0.0.1

# VS Code devcontaine

ローカルのターミナルで以下コマンドを実行し,VS Codeが立ち上げます.

# 環境構築用のgit
git clone https://github.com/karaage0703/mikanos-devcontainer
# ディレクトリ移動
cd mikanos-devcontainer
# VSCodeで実行
code .

そして,VS Codeの左下の緑マークを押し,コマンドパレットでOpen Folder in Container...を選択します.

しばらく待つと,以下のようなダイアログが表示されるのでmikanos-devcontainerが選ばれていることを確認してOpenをクリックしますと,環境構築が一気に済みます.

# 環境構築の確認(Hello World)

ここからは,VS Code上でのターミナルで実行します.

# edk2の環境設定

「ゼロからのOS自作入門」の筆者のgitから,コードをもろもろクローンします.

# mikanosのgitをclone
cd /workspaces/mikanos-devcontainer/
git clone https://github.com/uchan-nos/mikanos.git
OS_DIR=/workspaces/mikanos-devcontainer/mikanos

そして,以下のコードでedk2の環境設定を実施します.

# edk2のディレクトリに移動
cd ~/edk2
# mikanosのパッケージを追加
ln -s $HOME/workspace/mikanos/MikanLoaderPkg ./
# 環境変数設定用のスクリプト
source edksetup.sh
# 設定内容情報を作業ディレクトリにコピー
cp Conf/target.txt /workspaces/mikanos-devcontainer/target.txt 

# Hello World

環境構築確認のために,Hello Worldのコードを本の解説を見ながら自作するのは重たい作業なので,あらかじめクローンされているuchan-nos/mikanos-build (opens new window)を使用します.ディレクトリの場所は~/osbookです.

ここからのコードの実行は,意味を調べずに機械的に実行します.(あくまでの環境構築の確認が目的なので)

最初は,イメージを作ってFATでフォーマットします.

cd ~/osbook/day01/bin
qemu-img create -f raw disk.img 200M
mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img

イメージをマウントして,バイナリファイル(hello.efi)を書き込んで,アンマウントします.

mkdir -p mnt
sudo mount -o loop disk.img mnt
sudo mkdir -p mnt/EFI/BOOT
sudo cp hello.efi mnt/EFI/BOOT/BOOTX64.EFI
sudo umount mnt

バイナリファイルを書き込んだイメージをQEMUで読み込み起動します.(XQuartzに表示される)

qemu-system-x86_64 -drive if=pflash,format=raw,file=$HOME/osbook/devenv/OVMF_CODE.fd -drive if=pflash,format=raw,file=$HOME/osbook/devenv/OVMF_VARS.fd -drive file=disk.img,format=raw,index=0,media=disk

# まとめ

Mac + Dockerで「ゼロからのOS自作入門」の環境構築を実装しました.

「ゼロからのOS自作入門」を進めていく上で,弊害が出た場合は逐次修正します.

# 参考サイト

Docker ではじめる "ゼロからのOS自作入門" (opens new window)

「ゼロからのOS自作入門」の副読本的記事 (opens new window)

uchan-nos/mikanos (opens new window)

uchan-nos/mikanos-build (opens new window)

sarisia/mikanos-devcontainer (opens new window)

sarisia/mikanos-docker (opens new window)

bun913/go_devcontainer (opens new window)

「ゼロからのOS自作入門」のサポートサイト (opens new window)

4 macOSでのX Window利用 (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# おまけ(用語の確認)

EDKⅡ

EDKⅡはUEFI BIOS自体の開発にも,UEFI BIOS上で動くアプリケーションの開発にも使うことができる開発キット
引用元:[「ゼロからのOS自作入門」p48]

UEFI(Unified Extensible Firmware Interface) or UEFI BIOS

UEFIとは、一言で言うと「最近のPCやサーバーに入っている、新しくて高機能なファームウェア(及びそのインターフェースの仕様)」です。
体感では、2世代目Core iシリーズのCPU以降が入っているマシンには、このUEFIが従来のBIOS(以降、BIOSと表記)の代わりに、または選択可能な状態で入っているように感じています。
引用元:gnu-efiでUEFI遊びをはじめよう (opens new window)

BIOS(Basic Input / Output System)

BIOSは「Basic Input/Output System」の略で、CPUやメモリ、キーボード、マウスなどPCの大半の機能を制御しています。PCを起動したとき最初に作動するのがBIOSで、OSやソフトウェアとの橋渡しをする役割を担っています。
引用元:BIOSとUEFIの違いについて詳しく解説!次世代のレガシーBIOSとは? (opens new window)

UEFI BIOSと従来のBIOSの違いについて

  1. 2 TB以上のドライブを処理できます。それに対して、古いレガシーBIOSは大容量のストレージドライブを処理できませんでした。
  2. GUIDパーティションテーブルで4つ以上のプライマリパーティションが作成可能です。
  3. BIOSより起動プロセスが高速です。UEFIの最適化により、システムの起動がより速くなる可能性があります。安全な起動をサポートしています。つまり、オペレーティングシステムの有効性の検証によって、起動プロセスを改ざんするマルウェアがないことを確認できます。
  4. UEFIファームウェア自体のネットワーク機能をサポートして、リモートトラブルシューティングとUEFI構成に役立ちます。
  5. グラフィカルユーザーインターフェイスはシンプルで、レガシーBIOSよりも豊富なセットアップメニューがあります。

    引用元:UEFIとBIOS、どっちがいい? (opens new window)
    より詳細に:現代における自作OSの難しさ 〜自作OSのいまと昔 [第2回] (opens new window)
SlideShareと連携してVuepressにスライド機能を実装する

SlideShareと連携してVuepressにスライド機能を実装する

SlideShareと連携してVuepressにスライド機能を実装します.

MNISTの分類問題をLSTM(Long short-term memory)で実装する

MNISTの分類問題をLSTM(Long short-term memory)で実装する

LSTM(Long short-term memory)にも手を出すために,初心者用としてMNISTの分類 問題を実装します.