Mercurial > hg > Document > Growi
changeset 114:3050cf02700d
backup 2023-03-07
author | autobackup |
---|---|
date | Tue, 07 Mar 2023 00:10:05 +0900 |
parents | 5f712e09cf8a |
children | ed2a5faa5b30 |
files | user/matac42/notes/2023/03/06.md |
diffstat | 1 files changed, 245 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/matac42/notes/2023/03/06.md Tue Mar 07 00:10:05 2023 +0900 @@ -0,0 +1,245 @@ +## 読み物 + +### セキュリティキャンプでxv6を64bitUEFIから起動した話 + +https://anqou.net/poc/2018/08/22/post-1860/ + +### ブートローダーは4行で実装される + +https://orumin.blogspot.com/2014/12/4.html + +EDK APPを作成するにはtianocoreなどのツールキットを使うと良いらしい +https://github.com/tianocore/edk2-platforms + +BSDL(Boundary Scan Description Language)ファイルは、 +ICのピンに何が割り当てられているか、レジスタの機能はなにかを示すファイル。 +https://www.tokudenkairo.co.jp/jtag/adv2018/06.php + +JTAGはネットワークスイッチにおけるコンソールみたいなものだろうか。 +JTAGでICに接続してなんか色々できるっぽい。 +https://www.tokudenkairo.co.jp/jtag/whatisjtag.html +> FPGAの書き込みや、CPUのデバッグ、基板検査、ICの内部回路とパソコン間での通信などができます。 + +らしい。ほとんどがプライベート命令でプロトコルが公開されていないことが多いので開発者にしか扱えなさそう。 + +最初の記事に戻って、UEFI Appを作成する際に使用するツールキット(ライブラリ?) +はEDKかgnu-efiを選ぶという感じだ。XV6をUEFIで起動するというのを徳里氏がやってたけど、 +どちらか使ったりしてたかな。 +> gnu-efiは、Linux/OS Xの上で開発するにはEDKより手軽にはじめる事ができます。 + +らしい。Mattermostを遡ると奥田さんがgnu-efiで書かれたSimpleMyLoaderを動かそうとしていた。 +https://github.com/orumin/SimpleMyLoader + +https://mattermost.ie.u-ryukyu.ac.jp/cr-ie-u-ryukyu/pl/zu4jhdjazi84mbntp1sxhq8ukc + +PEバイナリとは?実行ファイルらしい。Windowsのexeファイルなどがこれに当たる。 + +記事内にて +> いきなりコード貼ってしまいましたが、そんなにコード量はないですね。 + +コードがないんですが?(悲しい)。 +あ、この記事で使ってるのがSimpleMyLoaderか。 + +> BIOSメーカーでありUEFIコンソーシアムの参加企業でもあるPhoenixのwikiに、 +構造体の一覧が見やすく書いてあるのでこれを見ると良いです。 + +http://wiki.phoenix.com/wiki/index.php/Category:UEFI_2.0 +ページが死んでいた。悲しい(2回目) + +4行で実装されると言っていた4行はこれ +``` + Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, &LoadedImageProtocol, &LoadedImageParent, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + Path = FileDevicePath(LoadedImageParent->DeviceHandle, L"\\vmlinuz"); + Status = uefi_call_wrapper(BS->LoadImage, 6, FALSE, ImageHandle, Path, NULL, 0, &Image); + Status = uefi_call_wrapper(BS->StartImage, 3, Image, NULL, NULL); +``` +1行目でLoadedImageParentに自分自身のデバイスハンドルを取得し、 +2行目で1行目で得たデバイスハンドルを使用して、イメージのファイルパスを指定する。 +3行目でイメージを呼び出し(メモリにカーネルを展開し)、 +4行目でカーネルを起動する。 + +### 64bitUEFIでxv6を動かす方法(ブートローダー編) + +https://pibvt.hateblo.jp/entry/2018/09/15/010757 + +x86の64bit拡張はx86_64だと認識しているが、 +> 本記事では、x86の64bit拡張、いわゆるIA32eをx86-64と呼称します。 + +IA32eという正式名称があるみたい? 32bit extensions + + +## How to UEFI debug with GDB +- https://wiki.osdev.org/Debugging_UEFI_applications_with_GDB +- https://github.com/tianocore/tianocore.github.io/wiki/How-to-debug-OVMF-with-QEMU-using-GDB + +なんか色々脱線してしまっている... + +## ゼミ + +ブロック単位のデータ構造で書き込むのはランダムアクセスが無いようなもの、HDDなどを使うときには有効だが... +DBのキャッシュマネジメント +NVRAMとメモリの書き込みにどれくらいの速度差があるか +ログがディスク上に残ればよい。ログはリアルタムである必要はない。 +->ディスク上とメモリ上が同じデータ構造になれば良い + +データベース関連の情報 +- sigmod トップカンファレンスらしい +- https://2022.sigmod.org/sigmod_research_list.shtml + +後でscrapboxも漁らなきゃ + +singularityで動かせる +run-aauefi.shの方が64bit + +## ゼミ後 + +### NVRAMとメモリの速度差 + +https://qiita.com/awakia/items/c8ada6c8101efe2de561 + +ランダムアクセスだと1000倍くらいメモリが速いっぽい? + +単位変換ツール +https://www.unitsconverters.com/en/Mt/S-To-Mb/S/Utu-6007-3755 + +7200MT/s -> 460800 Mb/s (DDR5) + +500MB/s -> 4000Mb/s (適当なSSD) + +460800 / 4000 = 115.2 + +115.2倍か。Qiitaの記事は2016年のものなので、だんだんメモリとSSDの速度差が縮まっているのかも。 +きっともっと速いSSDもあるんじゃなかろうか。M.2だと32Gb/s出るみたい。 + +32Gb/s -> 32000Mb/s + +460800 / 32000 = 14.4倍 + +14.4倍はかなり差が縮まっているな。 + +### singularityでCbC_xv6を動かす + +scrapboxにまとめがある +- xv6 / Gears のUEFI対応 https://scrapbox.io/cr-ryukyu/xv6_%2F_Gears_%E3%81%AEUEFI%E5%AF%BE%E5%BF%9C + +なんかディレクトリがないとか色々文句言われるけど、取り合えずゼミであった該当エラーの場所に辿り着いた。 +``` +[dalmore:/xv6-UEFI] +#(cd gnu-efi-3.0.12; make apps) +mkdir -p /xv6-UEFI/gnu-efi-3.0.12/x86_64/apps +make -C /xv6-UEFI/gnu-efi-3.0.12/x86_64/apps -f /xv6-UEFI/gnu-efi-3.0.12//apps/Makefile SRCDIR=/xv6-UEFI/gnu-efi-3.0.12//apps ARCH=x86_64 +make[1]: Entering directory '/xv6-UEFI/gnu-efi-3.0.12/x86_64/apps' +gcc -I/xv6-UEFI/gnu-efi-3.0.12//apps -I/xv6-UEFI/gnu-efi-3.0.12//apps/../inc -I/xv6-UEFI/gnu-efi-3.0.12//apps/../inc/x86_64 -I/xv6-UEFI/gnu-efi-3.0.12//apps/../inc/protocol -Wno-error=pragmas -mno-red-zone -mno-avx -fpic -g -O2 -Wall -Wextra -Werror -fshort-wchar -fno-strict-aliasing -ffreestanding -fno-stack-protector -fno-stack-check -fno-stack-check -fno-merge-all-constants -DCONFIG_x86_64 -DGNU_EFI_USE_MS_ABI -maccumulate-outgoing-args --std=c11 -D__KERNEL__ -I/usr/src/sys/build/include -c /xv6-UEFI/gnu-efi-3.0.12//apps/bootloader.c -o bootloader.o +/xv6-UEFI/gnu-efi-3.0.12//apps/bootloader.c: In function 'efi_main': +/xv6-UEFI/gnu-efi-3.0.12//apps/bootloader.c:55:12: error: 'LoadedImageParent' is used uninitialized in this function [-Werror=uninitialized] + Path = FileDevicePath(LoadedImageParent->DeviceHandle, L"\\kernel.elf"); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +cc1: all warnings being treated as errors +/xv6-UEFI/gnu-efi-3.0.12//apps/../Make.rules:52: recipe for target 'bootloader.o' failed +make[1]: *** [bootloader.o] Error 1 +make[1]: Leaving directory '/xv6-UEFI/gnu-efi-3.0.12/x86_64/apps' +Makefile:79: recipe for target 'apps' failed +make: *** [apps] Error 2 +``` + +一応`sh run-aauefi.sh`を実行すればUEFIシェルは起動する。上記はUEFI Appをビルドできないというやつ。 + +`fs0:`でファイルシステム(デバイス)をアタッチしてるのかな?lsしてみるとなんか色々あることがわかる。 +``` +FS0:\> ls +FSOpen: Open '.' Success +FSOpen: Open '\AllocPages.efi' Success +FSOpen: Open '\FreePages.efi' Success +FSOpen: Open '\Hello.efi' Success +FSOpen: Open '\bltgrid.efi' Success +FSOpen: Open '\bootloader.efi' Success +FSOpen: Open '\debughook.efi' Success +FSOpen: Open '\debughook.efi.debug' Success +FSOpen: Open '\drv0.efi' Success +FSOpen: Open '\drv0_use.efi' Success +FSOpen: Open '\exit.efi' Success +FSOpen: Open '\lfbgrid.efi' Success +FSOpen: Open '\modelist.efi' Success +FSOpen: Open '\printenv.efi' Success +FSOpen: Open '\route80h.efi' Success +FSOpen: Open '\setdbg.efi' Success +FSOpen: Open '\setjmp.efi' Success +FSOpen: Open '\t.efi' Success +FSOpen: Open '\t2.efi' Success +FSOpen: Open '\t3.efi' Success +FSOpen: Open '\t4.efi' Success +FSOpen: Open '\t5.efi' Success +FSOpen: Open '\t6.efi' Success +FSOpen: Open '\t7.efi' Success +FSOpen: Open '\t8.efi' Success +FSOpen: Open '\tcc.efi' Success +FSOpen: Open '\testboot.efi' Success +FSOpen: Open '\unsetdbg.efi' Success +Directory of: FS0:\ +01/15/2023 22:27 37,152 AllocPages.efi +01/15/2023 22:27 33,056 bltgrid.efi +01/15/2023 22:27 33,056 bootloader.efi +01/15/2023 22:27 33,040 debughook.efi +01/15/2023 22:27 36 debughook.efi.debug +01/15/2023 22:27 33,056 drv0.efi +01/15/2023 22:27 33,056 drv0_use.efi +01/15/2023 22:27 33,056 exit.efi +01/15/2023 22:27 37,152 FreePages.efi +01/15/2023 22:27 33,056 Hello.efi +01/15/2023 22:27 33,056 lfbgrid.efi +01/15/2023 22:27 33,056 modelist.efi +01/15/2023 22:27 33,056 printenv.efi +01/15/2023 22:27 33,056 route80h.efi +01/15/2023 22:27 33,056 setdbg.efi +01/15/2023 22:27 33,056 setjmp.efi +01/15/2023 22:27 37,152 t.efi +01/15/2023 22:27 33,056 t2.efi +01/15/2023 22:27 33,056 t3.efi +01/15/2023 22:27 33,056 t4.efi +01/15/2023 22:27 33,056 t5.efi +01/15/2023 22:27 33,056 t6.efi +01/15/2023 22:27 33,056 t7.efi +01/15/2023 22:27 37,152 t8.efi +01/15/2023 22:27 33,056 tcc.efi +01/15/2023 22:27 33,056 testboot.efi +01/15/2023 22:27 33,056 unsetdbg.efi + 27 File(s) 875,860 bytes + 0 Dir(s) +FSOpen: Open '\' Success +``` + +`bootloader.efi`がbootloaderのUEFI AppでこれでKernelイメージを叩く感じのはずだ。 +実行してみるとエラーを吐く。 + +``` +FS0:\> bootloader.efi +FSOpen: Open '\bootloader.efi' Success +FSOpen: Open '\bootloader.efi' Success +FSOpen: Open '\bootloader.efi' Success +FSOpen: Open '\bootloader.efi' Success +[Security] 3rd party image[0] can be loaded after EndOfDxe: PciRoot(0x0)/Pci(0x1,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\bootloader.efi. +InstallProtocolInterface: 5B1B31A1-9562-11D2-8E3F-00A0C969723B 453AADA8 +Loading driver at 0x00044102000 EntryPoint=0x00044102138 +Loading driver at 0x00044102000 EntryPoint=0x00044102138 +InstallProtocolInterface: BC62157E-3E33-4FEC-9920-2D3B36D750DF 45403410 +ProtectUefiImageCommon - 0x453AADA8 + - 0x0000000044102000 - 0x0000000000007948 +InstallProtocolInterface: 752F3136-4E16-4FDC-A22A-E5F46812F4CA 479CF8F4 +Hello, EFI! +Hello,2! +UART address: 0x0 +Hello,UART! +Hello,3! +Could not load Not FoundError: Image at 00044102000 start failed: Not Found +Unloading driver at 0x00044102000 +FSOpen: Open '\' Success +``` + +イメージがないとのこと。見つけられてない感じ。ゼミはここで終わった。 + +## 明日の予定 + +- sigmod漁る +- `bootloader.efi`のエラーと戦ってみる?(他の例とか論文とかを読むのが良いかも)まずはビルドできないと始まらなそう。 +- https://pdos.csail.mit.edu/6.S081/2020/xv6/book-riscv-rev1.pdf +- https://www.sugawara-lab.jp/fig/xv6-riscv-jpn.pdf \ No newline at end of file