LoginSignup
4
4

More than 1 year has passed since last update.

linux ド素人だけど OS 自作 みかん 本にチャレンジしてみた

Last updated at Posted at 2022-01-01

お疲れ様です。
自分の環境で完走できたので、忘れないうちに手順をメモしておきます。

-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 分待った(笑)

hello_world_1_0.png

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

一応動いた。
hello_world_1_1.png

今後の勉強に役立ちそうなサイトを見つけたので
メモで貼っておく。

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_2_0.png

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

hello_world_2_0.png

なんか、それっぽい。次行こう。

ブートローダーの書き換えのみでいいらしい。

$ 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

hello_world_2_0.png

出来たようなので次に行く。
以下の記事では 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

hello_world_3_2.png

実は 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 はこちら。

hello_world_3_2.png

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

hello_world_3_2.png

次の演習については流用で行けると思った。

$ 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

hello_world_3_2.png

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

hello_world_3_2.png

コマンドは基本的に同じです。
後は osbook_day"**" <= ココだけ変えれば OK です。
残りは一気にやります。

osbook_day05b osbook_day05c osbook_day05d osbook_day05e osbook_day05f
hello_world_5_b.png hello_world_5_c.png hello_world_5_d.png hello_world_5_e.png hello_world_5_f.png

6章マウスとPCI

コマンドは 前章と要領は同じです。

osbook_day05b osbook_day05c osbook_day05d
osbook_day06a.png osbook_day06b.png osbook_day06c.png

7章割り込みとFIFO

コマンドは 前章と要領は同じです。

osbook_day07a osbook_day07b
osbook_day07a.png osbook_day07b.png

8章メモリ管理に挑戦

コマンドは 前章と要領は同じです(あってるかな)。

osbook_day08a osbook_day08b osbook_day08c
osbook_day08a.png osbook_day08b.png osbook_day08c.png

9章重ね合わせ処理

コマンドは 前章と要領は同じです。
演習 09e は高速化がポイントなんですが、画像では伝えられず(笑)

osbook_day09a osbook_day09b osbook_day09c osbook_day09d osbook_day09e
osbook_day09a.png osbook_day09b.png osbook_day09c.png osbook_day09d.png osbook_day09e.png

まだ途中ですが、一旦ここまで。
お疲れさまでした。

10章ウィンドウ

コマンドは 前章と要領は同じです。
ただのキャプチャですけど、やった人にはわかる画像です(笑)

osbook_day10a osbook_day10b osbook_day10c osbook_day10d osbook_day10e osbook_day10f osbook_day10g
osbook_day10a.png osbook_day10b.png osbook_day10c.png osbook_day10d.png osbook_day10e.png osbook_day10f.png osbook_day10g.png

11章タイマとACPI

コマンドは 前章と要領は同じです。

osbook_day11a osbook_day11b osbook_day11c osbook_day11d osbook_day11e
osbook_day11a.png osbook_day11b.png osbook_day11c.png osbook_day11d.png osbook_day11e.png

12章キー入力

コマンドは 前章と要領は同じです。

osbook_day12a osbook_day12b osbook_day12c osbook_day12d osbook_day12e osbook_day12f
osbook_day12a.png osbook_day12b.png osbook_day12c.png osbook_day12d.png osbook_day12e.png osbook_day12f.png

13章マルチタスク(1)

コマンドは 前章と要領は同じです。
下の画像、差分かります?!(笑)

osbook_day13a osbook_day13b osbook_day13c osbook_day13d
osbook_day13a.png osbook_day13b.png osbook_day13c.png osbook_day13d.png

14章マルチタスク(2)

コマンドは 前章と要領は同じです。
画像のみで違いを見せるのは不可能だ。。

osbook_day14a osbook_day14b osbook_day14c osbook_day14d
osbook_day14a.png osbook_day14b.png osbook_day14c.png osbook_day14d.png

15章ターミナル

コマンドは 前章と要領は同じよいはず。
一部、動作が書籍と異なる。

osbook_day15a osbook_day15b osbook_day15c osbook_day15d
osbook_day15a.png osbook_day15b.png osbook_day15c.png osbook_day15d.png

16章コマンド

コマンドは 前章と要領は同じよいはず。
書籍と異なる動作をメモ
・expr を打つとターミナルがフリーズ
・TaskB がなぜか消えている(最後の演習は消えてもよい)

osbook_day16a osbook_day16b osbook_day16c osbook_day16d osbook_day16e osbook_day16f
osbook_day16a.png osbook_day16b.png osbook_day16c.png osbook_day16d.png osbook_day16e.png osbook_day16f.png

17章ファイルシステム

コマンドは 前章と要領は同じ。

osbook_day16a osbook_day16b
osbook_day17a.png osbook_day17b.png

18章アプリケーション

osbook_day18b よりコマンドは以下で対応。

$ cd $HOME/workspace/mikanos
$ git checkout osbook_day18b
$ ./build.sh run
osbook_day18a osbook_day18b osbook_day18c osbook_day18d
osbook_day18a.png osbook_day18b.png osbook_day18c.png osbook_day18d.png

19章ページング

以下のコマンドで動作確認

$ cd $HOME/workspace/mikanos
$ git checkout osbook_day19a
$ ./build.sh run

hello_world_1_0.png

20章システムコール

前章と同じコマンドで対応。
演習が一部動作しなかった。

osbook_day20a osbook_day20b osbook_day20e
osbook_day20a.png osbook_day20b.png osbook_day20e.png

21章アプリからウィンドウ

前章と同じコマンドで対応。

osbook_day21b osbook_day21c osbook_day21e osbook_day21f
osbook_day21b.png osbook_day21c.png osbook_day21e.png osbook_day21f.png

22章グラフィックとイベント(1)

前章と同じコマンドで対応。

osbook_day22b osbook_day22c osbook_day22d osbook_day22e osbook_day22f
osbook_day22b.png osbook_day22c.png osbook_day22d.png osbook_day22e.png osbook_day22g.png

23章グラフィックとイベント(2)

前章と同じコマンドで対応。

osbook_day23a osbook_day23b osbook_day23c osbook_day23d osbook_day23e
osbook_day23a.png osbook_day23b.png osbook_day23c.png osbook_day23d.png osbook_day23e.png

24章複数のターミナル

前章と同じコマンドで対応。

osbook_day24a osbook_day24b osbook_day24c osbook_day24e osbook_day24f osbook_day24g
osbook_day24a.png osbook_day24b.png osbook_day24c.png osbook_day24e.png osbook_day24f.png osbook_day24g.png

25章アプリでファイル読み込み

以下のコマンドで対応

$ cd $HOME/workspace/mikanos
$ git checkout osbook_day25a
$ APPS_DIR=apps ./build.sh run
osbook_day25a osbook_day25b osbook_day25c
osbook_day25a.png osbook_day25b.png osbook_day25c.png

26章アプリでファイル書き込み

前章と同じコマンドで対応
なぜか osbook_day26 a/b にて mikanos のターミナル上で grep するとフリーズする

osbook_day26c osbook_day26d
osbook_day25c.png osbook_day25d.png

27章アプリのメモリ管理

前章と同じコマンドで対応
なぜか b だけ動かなかった。

osbook_day27a osbook_day27c osbook_day27d
osbook_day27a.png osbook_day27c.png osbook_day27d.png

28章日本語表示とリダイレクト

以下のコマンドで対応

cd $HOME/workspace/mikanos/
git checkout osbook_day28a
APPS_DIR=apps RESOURCE_DIR=resource ./build.sh run
osbook_day28a osbook_day28b osbook_day28c
osbook_day28a.png osbook_day28b.png osbook_day28c.png

29章アプリ間通信

前章と同じコマンドで対応
c が今一でした。たぶん sort が分かってないかも。

osbook_day29a osbook_day29b osbook_day29c osbook_day29d
osbook_day29a.png osbook_day29b.png osbook_day29c.png osbook_day29d.png

30章おまけアプリ

前章と同じコマンドで対応
b が動かない。e ががっつり日本語表示できない。f だと tokyost.jpg が開けない

osbook_day30a osbook_day30b osbook_day30d osbook_day30e osbook_day30f
osbook_day30a.png osbook_day30b.png osbook_day30d.png osbook_day30e.png osbook_day30f.png

とりあえず finish.
少しずつ技術的に掘り出したので、
興味のある方はこちらもどうぞ。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4