お疲れ様です。
自分の環境で完走できたので、忘れないうちに手順をメモしておきます。
##-2 章 当たりを着ける
以下の URL を確認。
WSL2 , Ubuntu 20.4 で動作確認した偉人を発見。
なるほど、下手こかなければ何とかなりそうだ。
##-1 章 付録A 開発環境のインストール
####WSL2 and Ubuntu のインストール
以下の URL を死ぬほどパクる。
当たりを着けた Ubuntu 20.4 をインストール
####Xサーバーの設定とインストール
インストールは適当に。
むしろ設定の方が迷う人が多いかもしれないが、
書籍の通りで十分。念のため分かりやすい URL を貼る
##0 章 ubuntu を起動
恐れず、Enter new UNIX username: と New password: , Retype new password: を適当に入力
とりあえず、以下のコマンドを打ってみる。
その後の必要な手順
####step1
以下の記述を.bashrc の一番下の行に書き込む
export DISPLAY=$(ipconfig.exe | grep "IPv4" | head -1 | awk '{print $NF}' | awk 'sub(/\r$/,"")'):0.0
ではファイルを開きましょう。
sudo vi .bashrc
linux のエディタの編集方法も念のためメモ。
(コピーして、ubuntu 画面上で右クリックするとコピーしたテキストを勝手に貼ってくれる)
このコマンドは以下から拝借。
####step2
.bashrc を起動時に勝手に読み込んでくれるように
適当なパッチ的な手順を踏む。
sudo vi .bash_profile
ubuntu を再起動して以下を試してみる。
$ echo $DISPLAY
192.168.11.13:0.0
ok なんか数字の羅列が出てきた。これで良し。
##1章 hello world まで
基本は以下を参照に進めていく。
以下のコマンドを実行
$ sudo apt update
$ sudo apt install git
$ cd $HOME
$ git clone https://github.com/uchan-nos/mikanos-build.git osbook
続いて開発環境のインストール
$ sudo apt install ansible
$ cd $HOME/osbook/devenv
$ ansible-playbook -K -i ansible_inventory ansible_provision.yml
冒頭の記事通りに
インストールが終わったら、
以下のコマンドで動作確認。
$ iasl -v
$ ls $HOME/edk2
ubuntu を再起動して次のステップへ。
速攻でありものを取得
$ curl -O https://raw.githubusercontent.com/uchan-nos/mikanos-build/master/day01/bin/hello.efi
では以下のコマンドを打つ。
$ qemu-img create -f raw disk.img 200M //img ファイルを作成
$ mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img //Fat で初期化
$ mkdir -p mnt //mnt を作成
$ sudo mount -o loop disk.img mnt //mnt に img を突っ込む
$ sudo mkdir -p mnt/EFI/BOOT //mnt の中に EFI/BOOT を作り
$ sudo cp hello.efi mnt/EFI/BOOT/BOOTX64.EFI //その中に .efi をねじ込む
$ sudo umount mnt //mount 解除(お作法!?
以下のコマンドで Hello world を確認した。
$ qemu-system-x86_64 -drive if=pflash,file=$HOME/osbook/devenv/OVMF_CODE.fd -drive if=pflash,file=$HOME/osbook/devenv/OVMF_VARS.fd -hda disk.img
ただ、出てくるまで 1,~2 分待った(笑)
###C ファイルからも Hello world してみた
以下のコマンドをタイプ
$ cd $HOME/osbook/day01/c
$ clang -target x86_64-pc-win32-coff -mno-red-zone -fno-stack-protector -fshort-wchar -Wall -c hello.c
$ lld-link /subsystem:efi_application /entry:EfiMain /out:hello.efi hello.o
$ $HOME/osbook/devenv/run_qemu.sh hello.efi
今後の勉強に役立ちそうなサイトを見つけたので
メモで貼っておく。
##2 章に行く前に
付録 B をちょっとカジル
$ mkdir $HOME/workspace
$ cd $HOME/workspace
$ git clone https://github.com/uchan-nos/mikanos.git
#2 章 EDKII で hello world
以下を参考にしながらコマンドを打つ
$ cd $HOME/workspace/mikanos/
$ git checkout osbook_day02a
$ cd ~/edk2
$ ln -s $HOME/workspace/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
すると Conf の下に target.txt が生成されるので
以下の項目を上書き。
#before
ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc
#after
ACTIVE_PLATFORM = MikanLoaderPkg/MikanLoaderPkg.dsc
#before
TARGET_ARCH = IA32
#after
TARGET_ARCH = X64
#before
TOOL_CHAIN_TAG = VS2015x86
#after
TOOL_CHAIN_TAG = CLANG38
なぜこのようなことをするのか、
補足の page を貼る。
変更が出来たら、さぁ build だ
$ cd $HOME/edk2
$ build
終わったら、以下のコマンドを実行。
$HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi
hello world が少し変わった。
pointer について以下のサイトが分かりやすかった。
##3章 カーネル
以下の page がとても参考になりました。
$ cd $HOME/workspace/mikanos
$ git checkout osbook_day03a
$ cd kernel
$ clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone \
-fno-exceptions -fno-rtti -std=c++17 -c main.cpp
$ ld.lld --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
カーネルが出来たらしいので、ブートローダーをビルドして
カーネルの起動を試みる。
% cd $HOME/edk2
% source edksetup.sh
% build
% $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
なんか、それっぽい。次行こう。
ブートローダーの書き換えのみでいいらしい。
$ cd $HOME/workspace/mikanos
$ git checkout osbook_day03b
$ cd $HOME/edk2
$ source edksetup.sh
$ build
$ $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
出来たようなので次に行く。
以下の記事では Error になったようだが、
こちらの windows の環境では問題なく動いた。
$ cd $HOME/workspace/mikanos
$ git checkout osbook_day03c
$ cd kernel
$ source $HOME/osbook/devenv/buildenv.sh
$ echo $CPPFLAGS
$ clang++ $CPPFLAGS -O2 --target=x86_64-elf -fno-exceptions -ffreestanding -c main.cpp
$ ld.lld $LDFLAGS --entry KernelMain -z norelro --image-base 0x100000 --static -o kernel.elf main.o
$ cd $HOME/edk2
$ source edksetup.sh
$ build
$ $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
実は 4 章に入ってしまいますが、
make をやってみます。
$ cd $HOME/workspace/mikanos/kernel
$ git checkout osbook_day04a
$ source $HOME/osbook/devenv/buildenv.sh
$ make
$ $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
参考 URL はこちら。
##4章 ピクセルをいじる
以下の URL を参考に。
$ cd $HOME/workspace/mikanos/kernel
$ git checkout osbook_day04b
$ source $HOME/osbook/devenv/buildenv.sh
$ make
$ cd $HOME/edk2
$ source edksetup.sh
$ build
$ $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
次の演習については流用で行けると思った。
$ cd $HOME/workspace/mikanos/kernel
$ git checkout osbook_day04c
$ source $HOME/osbook/devenv/buildenv.sh
$ make
$ cd $HOME/edk2
$ source edksetup.sh
$ build
$ $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
osbook_04day0d も同じ要領で行けます。
##5章文字を表示してみる
アプローチは前章と同じ。
$ cd $HOME/workspace/mikanos/kernel
$ git checkout osbook_day05a
$ source $HOME/osbook/devenv/buildenv.sh
$ make
$ cd $HOME/edk2
$ source edksetup.sh
$ build
$ $HOME/osbook/devenv/run_qemu.sh $HOME/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $HOME/workspace/mikanos/kernel/kernel.elf
コマンドは基本的に同じです。
後は osbook_day"**" <= ココだけ変えれば OK です。
残りは一気にやります。
osbook_day05b | osbook_day05c | osbook_day05d | osbook_day05e | osbook_day05f |
---|---|---|---|---|
|
##6章マウスとPCI
コマンドは 前章と要領は同じです。
osbook_day05b | osbook_day05c | osbook_day05d |
---|---|---|
##7章割り込みとFIFO
コマンドは 前章と要領は同じです。
osbook_day07a | osbook_day07b |
---|---|
##8章メモリ管理に挑戦
コマンドは 前章と要領は同じです(あってるかな)。
osbook_day08a | osbook_day08b | osbook_day08c |
---|---|---|
##9章重ね合わせ処理
コマンドは 前章と要領は同じです。
演習 09e は高速化がポイントなんですが、画像では伝えられず(笑)
|osbook_day09a|osbook_day09b|osbook_day09c|osbook_day09d|osbook_day09e|
|---|---|---|---|---|---|
||||||
まだ途中ですが、一旦ここまで。
お疲れさまでした。
##10章ウィンドウ
コマンドは 前章と要領は同じです。
ただのキャプチャですけど、やった人にはわかる画像です(笑)
osbook_day10a | osbook_day10b | osbook_day10c | osbook_day10d | osbook_day10e | osbook_day10f | osbook_day10g |
---|---|---|---|---|---|---|
##11章タイマとACPI
コマンドは 前章と要領は同じです。
osbook_day11a | osbook_day11b | osbook_day11c | osbook_day11d | osbook_day11e |
---|---|---|---|---|
##12章キー入力
コマンドは 前章と要領は同じです。
osbook_day12a | osbook_day12b | osbook_day12c | osbook_day12d | osbook_day12e | osbook_day12f |
---|---|---|---|---|---|
##13章マルチタスク(1)
コマンドは 前章と要領は同じです。
下の画像、差分かります?!(笑)
osbook_day13a | osbook_day13b | osbook_day13c | osbook_day13d |
---|---|---|---|
##14章マルチタスク(2)
コマンドは 前章と要領は同じです。
画像のみで違いを見せるのは不可能だ。。
osbook_day14a | osbook_day14b | osbook_day14c | osbook_day14d |
---|---|---|---|
##15章ターミナル
コマンドは 前章と要領は同じよいはず。
一部、動作が書籍と異なる。
osbook_day15a | osbook_day15b | osbook_day15c | osbook_day15d |
---|---|---|---|
##16章コマンド
コマンドは 前章と要領は同じよいはず。
書籍と異なる動作をメモ
・expr を打つとターミナルがフリーズ
・TaskB がなぜか消えている(最後の演習は消えてもよい)
osbook_day16a | osbook_day16b | osbook_day16c | osbook_day16d | osbook_day16e | osbook_day16f |
---|---|---|---|---|---|
##17章ファイルシステム
コマンドは 前章と要領は同じ。
osbook_day16a | osbook_day16b |
---|---|
##18章アプリケーション
osbook_day18b よりコマンドは以下で対応。
$ cd $HOME/workspace/mikanos
$ git checkout osbook_day18b
$ ./build.sh run
osbook_day18a | osbook_day18b | osbook_day18c | osbook_day18d |
---|---|---|---|
##19章ページング
以下のコマンドで動作確認
$ cd $HOME/workspace/mikanos
$ git checkout osbook_day19a
$ ./build.sh run
##20章システムコール
前章と同じコマンドで対応。
演習が一部動作しなかった。
osbook_day20a | osbook_day20b | osbook_day20e |
---|---|---|
##21章アプリからウィンドウ
前章と同じコマンドで対応。
osbook_day21b | osbook_day21c | osbook_day21e | osbook_day21f |
---|---|---|---|
##22章グラフィックとイベント(1)
前章と同じコマンドで対応。
osbook_day22b | osbook_day22c | osbook_day22d | osbook_day22e | osbook_day22f |
---|---|---|---|---|
##23章グラフィックとイベント(2)
前章と同じコマンドで対応。
osbook_day23a | osbook_day23b | osbook_day23c | osbook_day23d | osbook_day23e |
---|---|---|---|---|
##24章複数のターミナル
前章と同じコマンドで対応。
osbook_day24a | osbook_day24b | osbook_day24c | osbook_day24e | osbook_day24f | osbook_day24g |
---|---|---|---|---|---|
##25章アプリでファイル読み込み
以下のコマンドで対応
$ cd $HOME/workspace/mikanos
$ git checkout osbook_day25a
$ APPS_DIR=apps ./build.sh run
osbook_day25a | osbook_day25b | osbook_day25c |
---|---|---|
##26章アプリでファイル書き込み
前章と同じコマンドで対応
なぜか osbook_day26 a/b にて mikanos のターミナル上で grep するとフリーズする
osbook_day26c | osbook_day26d |
---|---|
##27章アプリのメモリ管理
前章と同じコマンドで対応
なぜか b だけ動かなかった。
osbook_day27a | osbook_day27c | osbook_day27d |
---|---|---|
##28章日本語表示とリダイレクト
以下のコマンドで対応
cd $HOME/workspace/mikanos/
git checkout osbook_day28a
APPS_DIR=apps RESOURCE_DIR=resource ./build.sh run
osbook_day28a | osbook_day28b | osbook_day28c |
---|---|---|
##29章アプリ間通信
前章と同じコマンドで対応
c が今一でした。たぶん sort が分かってないかも。
osbook_day29a | osbook_day29b | osbook_day29c | osbook_day29d |
---|---|---|---|
##30章おまけアプリ
前章と同じコマンドで対応
b が動かない。e ががっつり日本語表示できない。f だと tokyost.jpg が開けない
osbook_day30a | osbook_day30b | osbook_day30d | osbook_day30e | osbook_day30f |
---|---|---|---|---|
とりあえず finish.
少しずつ技術的に掘り出したので、
興味のある方はこちらもどうぞ。