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