ゼロからの OS 自作入門 を読みながらカーネルの最初の実装を行うところまでの流れを確認する
コンパイルとリンクは以下のコマンドにて行う
$ clang++ -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c kernel/main.cpp $ ld.lld -entry KernelMain -z norelro --image-base 0x1000000 --static -o kernel.elf main.o
--target=x86_64-elf
オプションは文字通り x86_64 むけの機械語を ELF 形式にて出力するという指定-ffreestanding
オプションはフリースタンディング環境での動作環境を想定したコンパイルを意味する
ld.lld
は ELF の出力を行う LLVM 向けのリンカこのようにして作成した ELF ファイルはただ待機するだけだが、ブートローダーではなく立派な Kernel であるが、そのために実際にマシンで実行するためにはこのカーネルを読み出すブートローダーを実装してやらなければならない
$ readelf -h ~/Workspace/OS/MikanOS/kernel.elf ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x1001120 Start of program headers: 64 (bytes into file) Start of section headers: 880 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 4 Size of section headers: 64 (bytes) Number of section headers: 11 Section header string table index: 9
脇道にそれてメモった内容を残しておく
前提
$ tree . └── pkg └── file 1 directory, 1 file
ハードリンクとシンボリックリンクを行う
$ ln ./pkg/file ./hardlinked_file $ ln -s ./pkg/file ./softlinked_file $ $ tree . ├── hardlinked_file ├── pkg │ └── file └── softlinked_file -> ./pkg/file
ハードリンクは実体と同じ i ノードを指しているが、シンボリックリンクは異なる i ノードを指している。inode に関しては以前、これを枯渇させる実験を行ったときのメモ記事もある。
$ ls -i ./pkg/file 98981669 ./pkg/file dir $ ls -i ./hardlinked_file 98981669 ./hardlinked_file dir $ ls -i ./softlinked_file 98981732 ./softlinked_file
そのためリンク先のファイルを削除するとシンボリックリンクからはアクセスできなくなる一方で、ハードリンクは普通にひらける
$ rm ./pkg/file $ ioen ./softlinked_file -bash: ioen: command not found $ open ./hardlinked_file $
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです