ããŒãããã®OSèªäœå ¥éãã®å¯èªæ¬çèšäº
æåã«
ããŒãããã®OSèªäœå ¥éããå®è·µããããã®ãç°å¢æ§ç¯æ¹æ³åã³ã³ãã³ããªã¹ããšå®è¡çµæã®ã¡ã¢ã§ããæçã§å®è¡ãããæ¹ãããŸãåããããšãã§ããªã人çšã®èšäºãšãªããŸãã
æžç±ã«é¢ããææ³ã¯ã以äžããã°èšäºã«æžããŠããã®ã§ãæžç±èªäœãè²·ãããè¿·ã£ãŠãã人ã¯ãã¡ããåèã«ããŠã¿ãŠãã ããã
æ¬èšäºã¯ããŒãããã®OSèªäœå ¥éããèªãã§ãå人çã«ãŸãšãããã®ãšãªããŸããå 容ã«é¢ããŠãããåé¡ã誀ãããã£ãå Žåã®æè²¬ã¯ç§ã«ãããŸãã®ã§ããã®èšäºã«é¢ããŠã®çåã¯ç§ã«åãåãããã ããããã¡ããæžç±èªäœã®è³ªåã¯ãæžç±ã®ãµããŒãã«é£çµ¡ãã ããã
ãã®èšäºãèªããšãæžç±ãèªãŸãªããŠãOSãåããããšã¯ã§ããŸãããã ãæžç±ãèªã¿ãªããèªåã§çè§£ãããæ¹é ãããããªããåãããªããšäœã身ã«ã€ããªããšæãã®ã§ãèå³ããäººã¯æžç±ãè²·ããŸããããäŸ¡æ Œã®äœåãã®äŸ¡å€ãããè¯æžã ãšæããŸãã
0ç« ä»é²A åæã»ããã¢ãã
ãã€ãã£ãã®Linux(Ubuntu)ã«ã»ããã¢ããããæ¹æ³ãšãMac(Intel)+Dockerãäœ¿ãæ¹æ³ãèšèŒããŸãã
ãã€ãã£ãã®Macã«ã€ã³ã¹ããŒã«ããæ¹æ³ã ãšãèªåã®ç°å¢ã§ã¯ã«ãŒãã«ã®æç»ãã©ãããŠãããŸããããŸããã§ããã以äžã®ã¹ã¯ã©ããã«å¥®éèšãæ®ããŠããã®ã§ããã£ã¬ã³ãžãããæ¹ã¯åèã«ããŠã¿ãŠãã ããïŒããŸããããªãåå ããã£ã人ãããæããŠãã ããïŒã
ãã€ãã£ãã®Linuxã«ã»ããã¢ããããæ¹æ³
ãã·ã³ã¯X86äºæã®é©åœãªãã®ãéžã³ãŸãããããšãã£ãŠãäœãéžãã ãè¯ããåãããªã人ã¯ãSEEEDããã®ODYSSEY X86J4105ããããè¯ãããšæããŸããä»åã®èšäºããã€ãã£ãã®Linux(Ubuntu)ã«é¢ããŠã¯ãã®ãã·ã³ã§æ€èšŒããŠããŸãã
Linuxã®ã»ããã¢ããã«é¢ããŠã¯ã以äžèšäºãåç §ãã ããã
å šéšã»ããã¢ããããå¿ èŠã¯ãããŸãããããšãã£ã¿ã¯äœãããã€ã³ã¹ããŒã«ããŠãããŸããããåå¿è ã§ããã°VS Codeãããããã§ããVS Codeã«é¢ããŠã¯ã以äžZennã®æ¬åç §ãã ããã
ããšã¯ãæžç±ã®ä»¥äžãªããžããªãåèã«ã»ããã¢ããããŸãããã
ãMikanOS ã®ãœãŒã¹ã³ãŒãã®å ¥æãã®ãšãããŸã§ã³ãã³ããREADMEã®éãã«æã¡ãŸãããããMikanOS ã®ãœãŒã¹ã³ãŒãã®å ¥æã以éã«é¢ããŠã¯ã以äžã³ãã³ããå®è¡ããŸãã
$ sudo apt install -y python3-distutils
$ mkdir ~/workspace && cd ~/workspace
$ git clone https://github.com/uchan-nos/mikanos.git
$ OS_DIR=~/workspace/mikanos
$ cd ~/edk2
$ ln -s $HOME/workspace/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
Conf/target.txtã®ç·šéã¯READMEã®éãã§ããVS Codeã§ç·šéããå Žåã¯ã以äžã³ãã³ãå®è¡ããŸãããã
$ cd ~/edk2 && code .
ç·šéãçµãã£ããããã€ãã£ããªLinuxã§ã®ã»ããã¢ããã¯å®äºã§ãã1ç« ã«é²ã¿ãŸãããã
Mac+Dockerã§ã»ããã¢ããããæ¹æ³
Macã¯Intel Macã䜿ããŸããApple Silicon(M1) Macã¯ãèªåã®ç°å¢ã§ã¯Dockerãã«ãã§ãããŸãããã»ããã¢ããæ¹æ³ã¯ã以äžèšäºãåèã«ããŸããã
äžèšèšäºã®VS Code Remote Container(devcontainer)ãäœ¿ãæ¹æ³ãæé«ã§ãã以äžã®å³ïŒå°ãåããã¥ããã§ããïŒã®ããã«VS Codeã§Dockerã®ã³ã³ããå ã®ãã¡ã€ã«ã®ç·šéãšã³ã³ããå ã§ã®ã¿ãŒããã«æäœãã§ããŸããXQuartzã«Xãé£ã°ãããšã§ã³ã³ããå ã®GUIã¢ããªãåããããšãã§ããŸãã
ã»ããã¢ããæ¹æ³ã¯ãã»ãšãã©åèã«ããèšäºãã®ãŸãŸãªã®ã§ãããå°ãã ãèªåãåãã£ãŠãªãã£ããšãããè£è¶³ããŸãããŸããäºåæºåãšããŠä»¥äžãã»ããã¢ããããŠããå¿ èŠããããŸãã
- Docker
- VS Code
- XQuartz
Docker
Dockerã«é¢ããŠã¯ä»¥äžèšäºåèã«ããŠã€ã³ã¹ããŒã«ããŠãäœ¿ãæ¹ã確èªããŠãããŠãã ããã
VS Code
VS Codeã«é¢ããŠã¯ã以äžåèã«ããŠã€ã³ã¹ããŒã«ããŠãããŠãã ããã
æ¡åŒµæ©èœã®Remote - Containersãã€ã³ã¹ããŒã«ããŠãããŠãã ããã
XQuartz
XQuartzãã€ã³ã¹ããŒã«ããŸããHomebrewã§ã€ã³ã¹ããŒã«ããå Žåã¯ä»¥äžã§ãã
$ brew install xquartz
Homebrewãã»ããã¢ãããããŠãªã人ã¯ãæåã«ä»¥äžã³ãã³ããæã¡èŸŒãã§Homebrewãã»ããã¢ããããŠããbrewã³ãã³ããå®è¡ãã ããã
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
XQuartzãèµ·åããŠãèšå®ã®ã»ãã¥ãªãã£ã§ä»¥äžã®ããã«èšå®ããŸãã
ã¿ãŒããã«ã§ä»¥äžå®è¡ããŠãããŸãã以äžã³ãã³ãã¯ãXQartzãèµ·åãããã³ã«å®è¡ããå¿ èŠããããŸãã
$ xhost + 127.0.0.1
VS Code devcontainerã»ããã¢ãã
äžèšã®Docker, VS Code, XQuartzã®èšå®ãã§ããããå šéšãèµ·åããç¶æ ã§ä»¥äžã®READMEãåèã«ã»ããã¢ããã宿œããŸãã
å ·äœçã«ã¯ãã¿ãŒããã«ã§ä»¥äžã³ãã³ããå®è¡ããã°OKã§ãã
$ git clone https://github.com/karaage0703/mikanos-devcontainer
$ cd mikanos-devcontainer
$ code .
ããã§VS Codeãç«ã¡äžããã®ã§ãã³ãã³ããã¬ããã§Remote-Containers: Open Folder in Container...ãéžæããŸãããã°ããåŸ
ã€ãšã以äžã®ãããªãã€ã¢ãã°ã衚瀺ãããã®ã§mikanos-devcontainerãéžã°ããŠããããšã確èªããŠOKãã¯ãªãã¯ããŸãã
ãã®åŸãDockerã€ã¡ãŒãžãç«ã¡äžãããšä»¥äžã®ãããªç»é¢ã«ãªããŸãã
å³äžã®ã¿ãŒããã«ã«vscode â /workspaces/mikanos-devcontainer (master) $ ãšæžãããŠããŸãããããã¯Dockerå
ã®ã¿ãŒããã«ã«ãªããŸãã
Mac+Dockerã®å Žåã¯ã以éã¯ãã®ã¿ãŒããã«å ã§ã³ãã³ããå®è¡ããŠãããŸãããã§ã«ãDockerå ã§ã¯äžéãã»ããã¢ããã§ããç¶æ ã«ãªã£ãŠããã®ã§ã以äžã³ãã³ããå®è¡ããã°ã»ããã¢ããã¯å®äºã§ãã
$ cd /workspaces/mikanos-devcontainer/
$ git clone https://github.com/uchan-nos/mikanos.git
$ OS_DIR=/workspaces/mikanos-devcontainer/mikanos
$ cd ~/edk2
$ ln -s $HOME/workspace/mikanos/MikanLoaderPkg ./
$ source edksetup.sh
$ cp /workspaces/mikanos-devcontainer/target.txt Conf/target.txt
泚æäºé
ã¿ãŒããã«ãéãçŽããããæåã«ä»¥äžã³ãã³ããå®è¡ããå¿ èŠããããŸãã
ãã€ãã£ããªLinuxã®å Žå
$ OS_DIR=~/workspace/mikanos
Mac+Dockerã®å Žå
$ OS_DIR=/workspaces/mikanos-devcontainer/mikanos
$OS_DIRããã¹ã«èªã¿æ¿ããŠããã£ãŠãOKã§ãã
1ç« PCã®ä»çµã¿ãšãããŒã¯ãŒã«ã
1.4 ãšãã¥ã¬ãŒã¿ã§ã®ããæ¹
æžç±ã®ãã€ããªãã¡ã€ã«ã®å Žæã«ç§»åããŸãããã€ããªã®ã³ãŒãã¯ãmikanos-buildãªããžããªã®day01/bin/hello.efiãããã§ãã
$ cd ~/osbook/day01/bin
æ¬ã®ã³ã³ã»ãããããããšããã®å 容ã¯åçµããã®ãè¯ããšæããŸãããååŠè ã ãšããªãããŒãã«é«ãã®ã§ãããã§ã¯ããŸããææ¬ã®ããŒã¿äœ¿ã£ãŠåãã®ã確èªããŠãããŸããåããåŸããã€ããªãšãã£ã¿ã§ããHello, World!ãã®ãšããã奜ããªæåã«å€ããããåçµãããè¯ããšæããŸãã
æåã¯ãã€ã¡ãŒãžãäœã£ãŠFATã§ãã©ãŒãããããŸãã
$ qemu-img create -f raw disk.img 200M
$ mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img
ã€ã¡ãŒãžãããŠã³ãããŠããã€ããªãã¡ã€ã«ïŒhello.efiïŒãæžã蟌ãã§ãã¢ã³ããŠã³ãããŸãã
$ mkdir -p mnt
$ sudo mount -o loop disk.img mnt
$ sudo mkdir -p mnt/EFI/BOOT
$ sudo cp hello.efi mnt/EFI/BOOT/BOOTX64.EFI
$ sudo umount mnt
ãšãã¥ã¬ãŒã¿ãšããŠQEMUã䜿ããŸããæžç±ã®éãã«UEFIããŒãããããã«ãOVMFãã¡ã€ã«ãmikanos-buildã«çšæããŠãããã®ã䜿çšããŸããOVMFãã¡ã€ã«ã«é¢ããŠç¥ããã人ã¯ã以äžèšäºçåç §ãã ããã
æåŸã«ããã€ããªãã¡ã€ã«ãæžã蟌ãã ã€ã¡ãŒãžãQEMUã§èªã¿èŸŒã¿èµ·åããŸãã
$ 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
以äžã®ããã«è¡šç€ºããããOKã§ãã
1.9 Cèšèªã§ãããŒã¯ãŒã«ã
ãã€ããªã§ãªããCèšèªã§ãããŒã¯ãŒã«ããããŸãããã
Cèšèªã®ãœãŒã¹ã以äžã®ã³ãã³ãã§ã³ã³ãã€ã«ïŒãªã³ã¯ããŸãã
$ cd ~/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
hello.efiãã§ããŸãããrun_qemu.shãšããã¹ã¯ãªããã䜿ã£ãŠãå
çšã®ã€ã¡ãŒãžãäœã£ãŠãæžã蟌ãã§QEMUã§åãããšããæµããèªååããŸãã
以äžã³ãã³ã1è¡ãå®è¡ããã ãã§ãå çšåæ§QEMUã§ãHello, Worldãã衚瀺ã§ããŸãã
$ ~/osbook/devenv/run_qemu.sh hello.efi
2ç« EDK IIå ¥éãšã¡ã¢ãªããã
2.2 EDK2ã§ãããŒã¯ãŒã«ã
EDK2ãšããUEFIçšã®éçºãããã䜿çšããŸãã
ãã«ãããŸãã
$ cd $OS_DIR
$ git checkout osbook_day02a
$ cd ~/edk2
$ build
QEMUã§åãããŸãã
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi
3ç« ç»é¢è¡šç€ºã®ç·Žç¿ãšããŒãããŒã
3.3 åããŠã®ã«ãŒãã«
ã«ãŒãã«ãã³ã³ãã€ã«ããŠãªã³ã¯ããŸãã
$ cd $OS_DIR
$ 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
main.cppã®äžèº«ã¯ä»¥äžãã£ã3è¡ã®ç¡éã«ãŒãã§ãããããã«ãŒãã«ã§ãã
extern "C" void KernelMain() {
while (1) __asm__("hlt");
}
ããŒãããŒãããã«ãããŠQEMUã§ã«ãŒãã«ãèµ·åããŸãã
$ cd ~/edk2
$ source edksetup.sh
$ build
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $OS_DIR/kernel/kernel.elf
info registersãå®è¡ããŸãã
(qemu) info registers
RAX=0000000000100000 RBX=000000003effef18 RCX=0000000000000000 RDX=0000000000000000
RSI=000000003feaca08 RDI=000000003feac9e0 RBP=000000003fea8850 RSP=000000003fea8850
R8 =000000003fea87c4 R9 =000000003fb7b48f R10=000000003fbcd018 R11=fffffffffffffffc
R12=000000003effe920 R13=000000003feac8d0 R14=000000003fea9110 R15=000000003e66273c
RIP=0000000000101011 RFL=00000046 [---Z-P-] CPL=0 II=0 A20=1 SMM=0 HLT=1
次ã®å®è¡ãããæ©æ¢°èªåœä»€ã®äœçœ®ã瀺ãRIPä»è¿ã2åœä»€åéã¢ã»ã³ãã«ããŠè¡šç€ºããŸãã
(qemu) x /2i 0x0000000000101011
0x00101011: eb fd jmp 0x101010
0x00101013: cc int3
èªåã®ã¢ãã¬ã¹ã«ãžã£ã³ãããŠããã®ã§ãã³ãŒãã®éãæ°žä¹ ã«ãŒãããŠãããã§ããã
3.4 ããŒãããŒããããã¯ã»ã«ãæã
$ cd $OS_DIR
$ git checkout osbook_day03b
$ 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 ~/edk2
$ source edksetup.sh
$ build
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $OS_DIR/kernel/kernel.elf
3.5 ã«ãŒãã«ãããã¯ã»ã«ãæã
$ source ~/osbook/devenv/buildenv.sh
$ echo $CPPFLAGS
$ cd $OS_DIR
$ git checkout osbook_day03c
$ cd kernel
$ 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 ~/edk2
$ source edksetup.sh
$ build
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $OS_DIR/kernel/kernel.elf
3.7 ãã€ã³ã¿å ¥éïŒïŒïŒïŒãã€ã³ã¿ãšã¢ã»ã³ããªèšèª
以äžã®ã³ãŒããfoo.cppãšããååã§ä¿åããŸãã
#include <cstdint>
void foo() {
int i = 42;
int* p = &i;
int r1 = *p;
*p = 1;
int r2 = i;
uintptr_t addr = reinterpret_cast<uintptr_t>(p);
int* q = reinterpret_cast<int*>(addr);
}
æžç±ã§ã¯ããClangã§ïŒæé©åããããã«ïŒã³ã³ãã€ã«ããããšæžããŠãããŸããå€å以äžã®ããã«ããŠãã¢ã»ã³ããªèšèªã«ãããšããããšã ãšæããŸãã
$ source ~/osbook/devenv/buildenv.sh
$ clang++ $CPPFLAGS -O0 --target=x86_64-elf -fno-exceptions -ffreestanding -c foo.cpp -S -masm=intel
$ less foo.s
æé©åããããªãããã«-O0ãªãã·ã§ã³ãæå®ããæžç±ã®Intelæ§æã«åãããããã«-masm=intelãšãããªãã·ã§ã³ãæå®ããŠããŸãã
4ç« ãã¯ã»ã«æç»ãšmakeå ¥é
4.1 makeå ¥é
makeã詊ããŠã¿ãŸãã以äžã³ãã³ãã§ãã«ãããŸãã
$ cd $OS_DIR
$ git checkout osbook_day04a
$ cd kernel
$ make
make cleanãããŠã¿ãŸãããã
$ make clean
4.2 ãã¯ã»ã«ãèªåšã«æã
$ cd $OS_DIR
$ git checkout osbook_day04b
$ cd kernel
$ source ~/osbook/devenv/buildenv.sh
$ make
$ cd ~/edk2
$ source edksetup.sh
$ build
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $OS_DIR/kernel/kernel.elf
5ç« ä»¥é
åãèŠé ã§å®è·µã§ãããšæããŸããããšã¯æžç±ãšåãããŠã楜ãã¿ãã ããã
ãããã¯ãŸãããããšããããé¢çœããšæã£ããšãããããã°è¿œèšããŠãããŸãã
æçµïŒææ°ïŒã®MikanOSã®åäœ
ãšãã¥ã¬ãŒã¿ã§ã®åäœç¢ºèª
æçµçãªMikanOSãåããæ¹æ³ã§ãããã€ãã£ãã®Linuxã®ã¿ã§ç¢ºèªããŠããŸãã
Mac+Dockerã§ã¯./uefi.hpp:7:10: fatal error: 'Uefi.h' file not foundãšãšã©ãŒã«ãªãåãããŸããã§ããïŒåå 調æ»äžïŒã
$ cd $OS_DIR
$ git checkout master
$ cd kernel
$ source ~/osbook/devenv/buildenv.sh
$ make
$ cd ~/edk2
$ source edksetup.sh
$ build
$ ~/osbook/devenv/run_qemu.sh ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi $OS_DIR/kernel/kernel.elf
以äžã®ããã«è¡šç€ºãããŸããããªãOSã£ãœãã§ããã
宿©ã§ã®åäœç¢ºèª
USBã¡ã¢ãªãæ¿å
¥ããŸããããã§ãæ¿å
¥ãããã£ã¹ã¯ã®ããã€ã¹ãã¡ã€ã«åã確èªããŸããdmesgãdfã³ãã³ãã䜿ã£ãŠèª¿ã¹ãŸãããã
èªåãããããã®ã¯df -hãUSBã¡ã¢ãªæ¿å
¥åãæ¿å
¥åŸã§æ¯èŒããå¢ããŠãããã®ã§ç¹å®ããæ¹æ³ã§ãã以éã¯/dev/sdbãUSBã¡ã¢ãªã®å Žåã®èª¬æã§ãã
ãã£ã¹ã¯ãã¢ã³ããŠã³ããFATã§ãã©ãŒããããããŠã³ãããŠãã¡ã€ã«ã®æžã蟌ã¿ãã¢ã³ãã³ãã宿œããŸãã
$ sudo umount /dev/sdb
$ sudo mkfs.fat /dev/sdb
$ sudo mkdir -p /mnt/usbmem
$ sudo mount /dev/sdb /mnt/usbmem
$ sudo mkdir -p /mnt/usbmem/EFI/BOOT
$ sudo cp ~/edk2/Build/MikanLoaderX64/DEBUG_CLANG38/X64/Loader.efi /mnt/usbmem/EFI/BOOT/BOOTX64.EFI
$ sudo cp $OS_DIR/kernel/kernel.elf /mnt/usbmem/
$ sudo umount /dev/sdb
äžèšã³ãã³ããå®è¡ãããšãã¡ã¢ãªã®äžã®ãã¡ã€ã«æ§æã¯ãæžç±ã®éã以äžã®ããã«ãªã£ãŠããã¯ãã§ãã
kernel.elf
/EFI/BOOT/BOOTX64.EFI
ãã®ç¶æ ã§ãPCãåèµ·åããŠUSBã¡ã¢ãªããããŒããããŸãã
USBããããŒããéžæããŸãã
ç¡äºèµ·åïŒãšèšããããšããã§ãããããŠã¹ãåããŸããã§ãããèªäœOSã®æ²Œã¯æ·±ãâŠ
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
git checkoutã§ããªã
ãšãããã以äžå®è¡ããŠãããgit checkoutããŸããããã³ãã³ãã®æå³ã¯å¥é調ã¹ãŠãããŸãããã
$ git stash
å¯ãéïŒ ãã«ã¹ã¯ã©ããã§äœã!UEFIãã¢ã¡ã¿ã«ããã°ã©ãã³ã°
以äžã®ããã°ã§ãä»ã«ãèªäœOSã®æ å ±ãããããšãç¥ããŸããã
以äžãç¡æã§å ¬éãããŠããŸãã
çŽ æŽãããæ å ±ã§ãããã¡ãã®æžç±ã¯ãedk2ã䜿ããªãåãããäœã¬ã€ã€ãŒãžã®çè§£ãæ·±ãŸãããã§ãããã ããã®èšäºã®å 容ããŒãããã®OSèªäœå ¥éãèªãã§äºåç¥èãªãã£ãããäœããåããŠãããéæ¹ã«ãããŠãããšæããŸããããŒãããã®OSèªäœå ¥éãèªãã§ãéçºæ¹æ³ãªã©ã身ã«ã€ããåŸãªããã¡ãã¡ããã®ã¡ããã§ãããããããšãããŒãããã®OSèªäœå ¥éãã
ãŸãã¯ãhello worldãããã£ãŠã¿ãŸãããã
é©åœãªãã£ã¬ã¯ããªãäœããŸãã
$ mkdir -p ~/work && cd ~/work
ããã°ã©ã ãããŠã³ããŒãããŠãã³ã³ãã€ã«&ãã«ãããŸãã
$ curl -O https://raw.githubusercontent.com/cupnes/c92_uefi_bare_metal_programming_samples/master/sample1_1_hello_uefi/main.c
$ clang -target x86_64-pc-win32-coff -mno-red-zone -fno-stack-protector -fshort-wchar -Wall -c main.c
$ lld-link /subsystem:efi_application /entry:efi_main /out:main.efi main.o
/entry:efi_mainãšãšã³ããªãŒãã€ã³ããæå®ããªããšãããªãç¹ã泚æã§ããããã¯ããŒãããã®OSèªäœå
¥éãã§ã¯çç¥ãããŠãããã€ã³ãã§ãããããã«ã¹ã¯ã©ããã§äœã!UEFIãã¢ã¡ã¿ã«ããã°ã©ãã³ã°ãã§ã¯ããã®ããã説æãããŠããã®ã§ãè¯ãè£å®é¢ä¿ã«ãªã£ãŠãããšæããŸãã
ç¶ããŠãããŒãããã®OSèªäœå ¥éãéãã«ã€ã¡ãŒãžãäœããŸãã
$ qemu-img create -f raw disk.img 200M
$ mkfs.fat -n 'MIKAN OS' -s 2 -f 2 -R 32 -F 32 disk.img
$ mkdir -p mnt
$ sudo mount -o loop disk.img mnt
$ sudo mkdir -p mnt/EFI/BOOT
$ sudo cp main.efi mnt/EFI/BOOT/BOOTX64.EFI
$ sudo umount mnt
QEMUã§å®è¡ããããHello UEFIïŒããšè¡šç€ºãããŸãã
$ 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
ãŸãšã
ããŒãããã®OSèªäœå ¥éããåãããªã人ã»äœãããŠãããããåãããªã人ã®å©ãã«ãªããããªèšäºãæžããŠã¿ãŸããã
èªåèªèº«ããŸã ãŸã çè§£ã§ããŠãªããšãããããã®ã§ãããã¯ãšãããã€ã³ãããã°ãéæè¿œèšããŠãããããšæããŸãã
åèãªã³ã¯
å ¬åŒãµã€ã
åç»
Macã§ã®åäœ
èšäº
Discussion
倱瀌ããŸããç§ãæè¿èªäœOSå ¥éãå§ããŠã第ïŒç« ã®ç»é¢è¡šç€ºã®ç·Žç¿ã®ãšããã§ãçœã衚瀺ãããã ãã®ç¶æ ã«ãªããŸããã解決çãåããããæŸãåºãããã«ãªãããããšãããã¹ã¯ã©ãããå«ãããã®èšäºãæèŠãããŠããã ããŸããããããããã°ã解決çããæç€ºããã ããªãã§ãããããããããããããããŸãã
@dtrackerhero ãã
è¿ä¿¡ããããªãç³ãèš³ãããŸããã
ãã€ãã£ãã®Macç°å¢ã ãšç§ã¯çµå±ã§ããªããŠãããã«èšèŒããããã«Mac(Intel)+Dockerããã€ãã£ãã®Linuxã䜿ããŸããã
倱瀌ããŸãïŒ
äžç¹æ°ã¥ããç¹ããã£ãã®ã§ã³ã¡ã³ãããŸãïŒ
ãVS Code devcontainerã»ããã¢ãããã§ã®ã·ã³ããªãã¯ãªã³ã¯ã®èšå®ã§ïŒ
$ ln -s $HOME/workspace/mikanos/MikanLoaderPkg ./ãšãªã£ãŠããŸããïŒmikanos-devcontainerãçšããå ŽåãMikanLoaderPkgããé 眮ãããã®ã¯ /workspaces/mikanos-devcontainer/mikanos/MikanLoaderPkg ããšæããŸãïŒ
ã§ãã®ã§ïŒäžèšã®ããã«ä¿®æ£ããå¿ èŠããããšæããŸããïŒ
â ä¿®æ£ç
$ ln -s /workspaces/mikanos-devcontainer/mikanos/MikanLoaderPkg ./äžèšä¿®æ£ãããããšã§ã2.2 EDK â ¡ ã§ãããŒã¯ãŒã«ããp51ã®buildãéãããã«ãªããŸããïŒ
ããç§ã®èŠåœéãã§ããããã¿ãŸããïŒ
ã³ã¡ã³ãããããšãããããŸãããã®èšäºã§ã¯
workspaceã§çµ±äžããŠããã®ã§workspaceã§åé¡ãªãã£ãèšæ¶ã§ãããèšäºãæžããŠããã ãã¶æéãçµã£ãŠããã®ã§èªä¿¡ããããŸããããŸãè©Šãæ©äŒããã£ããèŠçŽããããšæããŸãã
ãè¿äºé ãããããšãããããŸãïŒ
ã¯ãïŒãŸãæ©äŒãããã°ã詊ããã ããïŒ
ç°å¢æ§ç¯ãããã«ãããïŒãã¡ãã®èšäºå€§å€åèã«ãªããŸããïŒ
ããããšãããããŸããïŒ
ã³ã¡ã³ã倱瀌ããŸãã
ãVS Code devcontainerã»ããã¢ãããã®ã³ã³ããå ã§ã³ãã³ããå®è¡ããŠãããšãããªã®ã§ãããcpã³ãã³ãã®åŒæ°ïŒã³ããŒå ãã³ããŒå ïŒãéã«ãªã£ãŠãããããããŸããã
å ïŒ
cp /workspaces/mikanos-devcontainer/target.txt Conf/target.txtä¿®æ£ïŒ
cp Conf/target.txt /workspaces/mikanos-devcontainer/target.txtç§ã®ç°å¢ã ãšãäžèšä¿®æ£ãå ãããšããããã¡ã€ã«ã®ã³ããŒãæåããŸããã
ç§ã®åéãã ã£ãããã¿ãŸããã