nanashi no gonbei - uchan-nos/os-from-zero GitHub Wiki

開発環境:Ubuntu 18.04 on VirtualBox on Windows8.1

0章

OSの役割 1.アプリとのインターフェース(周辺機器制御) 2.人間とのインターフェース(アプリ制御) 3.計算資源分配(マルチタスク)

1章

バイナリファイルのソースはどこ? https://github.com/uchan-nos/mikanos-build/blob/master/day01/bin/hello.efi

ビルド環境構築 https://github.com/uchan-nos/mikanos-build ここで詰まる (A) ansible-playbook -K -i ansible_inventory ansible_provision.yml 上記コマンド実行後、反応がないので固まったのかと思いctrl+Cで中断。再実行後、以下のようなエラー


TASK [ensure development tools are at the latest version] ***********************************************************************************************************
fatal: [localhost]: FAILED! => {"cache_update_time": 1619012387, "cache_updated": false, "changed": false, "msg": 
"'/usr/bin/apt-get -y -o \"Dpkg::Options::=--force-confdef\" -o \"Dpkg::Options::=--force-confold\"     install 'llvm-7-dev'
 'lld-7' 'clang-7' 'nasm' 'acpica-tools' 'uuid-dev' 'qemu-system-x86' 'qemu-utils' 'unzip' -o APT::Install-Recommends=no' 
failed: E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).\n", "rc": 100, 
"std ・・・(以下略)

E: Unmet dependencies. Try 'apt --fix-broken install' with no packages とあるので、

sudo apt --fix-broken install を実行

その後、(A)のコマンドを再実行したらエラーも出ずに完了出来た。

付録A.01,A.02はUbtuntu on VirtualBoxには不要のためスキップ

【QEMUとは】

擬似的にプロセッサを動かすことができるソフト(エミュレータ)。VirtualBoxみたいなもの

【BIOSとは】

Basin Input output System 基本的な入出力機能。OS起動前にコンピュータ内部を初期化したり、OS(ブートローダ)をストレージから読みだす機能を提供するシステム

【UEFIとは】

Unified Extensible Firmware Interface 統一された拡張可能なファームウェアインターフェースとよばれる標準仕様 【PE、COFF、ELF】

PE・・・Windows標準の実行可能ファイル形式(.exeファイルのこと) COFF・・・オブジェクトファイル。PE形式のファイルを作る過程の中間ファイル ELF・・・Linux標準の実行可能ファイル形式(オブジェクトファイルの形式としても使用できる) ※実行可能ファイルとは・・・機械語で書かれたプログラム

2章

インクルードガードについて


#ifndef ____ABC____
#define ____ABC____
// source code
#endif

___ABC___が未定義なら、#defineから#endifの直前までコンパイルされる。 #define ABC は空定義(値がない)だが、プリプロセッサには定義されたものとみなされるので2重インクルードを防ぐことができる

メモリマップ

メインメモリのうち、どのアドレス範囲が何の用途で使われているかを示す情報

C++のポインタ

ポインタと整数は相互に変換可能。 ポインタは変数固有の番号と型情報を組み合わせたもの 変数固有の番号が具体的に何かは処理系によるが、変数が配置されたメモリアドレスを使うことが多い。

ポインタのポインタについて

複数の戻り値を持つ関数を作る場合、ポインタを引数として受け取ることがある。

変数(の中身)を書き換えたければ、変数のポインタを渡せばよいが、

変数のポインタを書き換えたい場合は、変数のポインタのポインタを渡す必要がある。

EFI_FILE_PROTOCOL* memmap_file;
EFI_FILE_PROTOCOL** ptr_ptr = &memmap_file;
root_dir->Open(
  `root_dir, ptr_ptr, 

3章

QEMUモニタの使い方

P73

clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone \
 -fno-exceptions -fno-rtti -std=c++17 -c main.cpp

-O2 はオーツーであってゼロツーではないことに注意

[16:00:34 edk2 $]build

を実行する前には、

source edksetup.sh

を実行してbuildのパスを通しておくこと。

QEMU実行

[20:36:33 ~ $]osbook/devenv/run_qemu.sh edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi

3-5 カーネルからピクセルを描く(ビルド~QEMU実行)

source ~/osbook/devenv/buildenv.sh
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
build
osbook/devenv/run_qemu.sh edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi workspace/mikanos/kernel/kernel.elf

kernelの実行ファイルを作成し、ブートローダーをビルド後、QEMUを実行している。

4章

4.3 C++の機能を使って書き直す

ビルド手順(カーネルで緑の四角を描く)

source ~/osbook/devenv/buildenv.sh
cd ~/workspace/mikanos/kernel && make
cd ~/edk2 && . edksetup.sh
build
cd && osbook/devenv/run_qemu.sh edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi workspace/mikanos/kernel/kernel.elf

5章

5.2 分割コンパイル

makefileについて
・コンパイル、リンクなどのビルド作業を自動化するための設定ファイル
$(変数:.o=.d) 変数.oを変数.dに変えたもの
.%.dは何のために生成している?
.dファイル(隠しファイル)を削除したいときは rm -f .*.d
依存関係については下記を参照
https://www.wagavulin.jp/entry/20120405/1333629926

⚠️ **GitHub.com Fallback** ⚠️