nanashi no gonbei - uchan-nos/os-from-zero GitHub Wiki
開発環境:Ubuntu 18.04 on VirtualBox on Windows8.1
OSの役割 1.アプリとのインターフェース(周辺機器制御) 2.人間とのインターフェース(アプリ制御) 3.計算資源分配(マルチタスク)
バイナリファイルのソースはどこ? 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標準の実行可能ファイル形式(オブジェクトファイルの形式としても使用できる) ※実行可能ファイルとは・・・機械語で書かれたプログラム
インクルードガードについて
#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,
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
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を実行している。
ビルド手順(カーネルで緑の四角を描く)
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
makefileについて
・コンパイル、リンクなどのビルド作業を自動化するための設定ファイル
$(変数:.o=.d) 変数.oを変数.dに変えたもの
.%.dは何のために生成している?
.dファイル(隠しファイル)を削除したいときは rm -f .*.d
依存関係については下記を参照
https://www.wagavulin.jp/entry/20120405/1333629926