Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Blend XMODEM -UEFI de XMODEM-/KernelvmKansai8

Blend XMODEM -UEFI de XMODEM-/KernelvmKansai8

UEFIでXMODEMを実装しようと頑張った話です。

Toshifumi NISHINAGA

November 18, 2017
Tweet

More Decks by Toshifumi NISHINAGA

Other Decks in Programming

Transcript

  1. リモートからプログラムを送る方法たち • シリアル転送(X/Y/Z MODEM, Kermit) ◦ メリット:追加部品がいらない。パソコン側の設定もいらなくて楽。 ◦ デメリット:遅い。実装が面倒。 •

    ネットワークブート(PXE(TFTP)ブート) ◦ メリット: 速い。安心(UEFI側の実装がちゃんとしてれば)。 ◦ デメリット: USB-NIC購入(1000円くらい)が必要(Hikey boardはNICを持たない)。 パソコン側の設定がちょっと必要。 ◦ https://wiki.linaro.org/Boards/Hikey/Setup/TFTPBoot
  2. SERIAL IO PROTOCOL • ボードのシリアルポートを直接Read/Writeできる ◦ http://wiki.phoenix.com/wiki/index.php/EFI_SERIAL_IO_PROTOCOL • 使い方 ◦

    LocateHandleでSERIAL_IO_PROTOCOLのハンドラを取得 ▪ シリアルポートが複数ある場合、各ポートに対応した複数のハンドラが取得できる ◦ HandleProtocolで任意のハンドラからSERIAL_IO_PROTOCOLを取得 ◦ SERIAL_IO_PROTOCOLのRead/Writeを使って読み書きすればOK ▪ https://github.com/tnishinaga/baremetal_hikeyboard/blob/master/uefi_serial_echo_sampl e/main.c
  3. x86 QEMUでシリアルを2本生やす • x86_64のQRMUならシリアルを2本生やせる ◦ qemu-system-x86_64 -cpu qemu64 \ -drive

    if=pflash,format=raw,unit=0,file=/usr/share/ovmf/ovmf_code_x64.bin,readonly=on \ -drive if=pflash,format=raw,unit=1,file=/usr/share/ovmf/ovmf_vars_x64.bin \ -hda fat:rw:. \ -chardev pty,id=pts0 -device isa-serial,chardev=pts0 \ -chardev pty,id=pts1 -device isa-serial,chardev=pts1 • ちゃんとUEFI側でも認識する ◦ 片方をデバッグ、片方をXMODEM通信用にしてデバッグ開始
  4. ご褒美5 • ptsをめぐる争い a. QEMUがシリアルポートをptsにつなげる b. minicomでptsを開く c. QEMUを終了する(minicomはptsを開いたまま) d.

    tmuxで新しいウィンドウを開く e. tmuxとminicomの入出力が繋がり入力を奪い合う • 対応 a. デバッグ中は今開いてるターミナルだけで頑張る
  5. ご褒美6 • 問題 a. 送信側はNAKを受け取ってデータを送ろうとしてる b. 受信側はデータを受け取れずタイムアウトしてNAKを送る c. NAKを受け取った送信側はデータを再送する d.

    以降繰り返し e. (データが闇に消えてる気がする) • 対策 a. タイムアウトを数回繰り返すまで待ってからNAKを送るようにした b. ちょっとぎこちないがx86のQEMU上ではデータを受け取れた
  6. ご褒美9 Q. 同じようなファイルのダウンロード先 が複数(Debian, Android, release, snapshot...) あるけど何処のをつかえばいいの? A. UEFI

    Shellを使いたいなら uefi-openplatformpkgのlatestをつかえば良い (reference-platformのはちょい使いづらい)
  7. HiKey boardをアップデートしよう • openplatformpkgなどからファイルを取得する ◦ wget https://builds.96boards.org/snapshots/reference-platform/components/uefi-staging/latest/hikey/release/hisi-i dt.py ◦ wget

    https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/l-loader.bin ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/fip.bin ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/ptable-linux-4g.img ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/ptable-linux-8g.img ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/nvme.img • boot-fat.uefi.imgは空のFATパーティションを用意する ◦ 既にBOOTパーティションにGRUB等が書き込まれている場合はShellが正しく 起動しなくなる ▪ dd if=/dev/zero of=boot-fat.uefi.img bs=1M count=64 && mkfs.vfat boot-fat.uefi.img
  8. HiKey boardをアップデートしよう • openplatformpkgなどからファイルを取得する ◦ wget https://builds.96boards.org/snapshots/reference-platform/components/uefi-staging/latest/hikey/release/hisi-i dt.py ◦ wget

    https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/l-loader.bin ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/fip.bin ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/ptable-linux-4g.img ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/ptable-linux-8g.img ◦ wget https://builds.96boards.org/snapshots/hikey/linaro/uefi-openplatformpkg/latest/nvme.img • boot-fat.uefi.imgは空のFATパーティションを用意する ◦ 既にBOOTパーティションにGRUB等が書き込まれている場合はShellが正しく 起動しなくなる ▪ dd if=/dev/zero of=boot-fat.uefi.img bs=1M count=64 && mkfs.vfat boot-fat.uefi.img
  9. まとめ • XMODEMはプロトコルは簡単だがUEFIでの実装結構大変 • UEFIではSERIAL_IO_PROTOCOLを使うと バイト単位でシリアル読み書きできる • SERIAL_IO_PROTOCOLでタイムアウト使ったときの 受信データの扱いは不安 •

    ptsはtmux等との奪い合いが起こる。仲良くしてほしい。 • UEFIでシリアルを使うアプリのデバッグ大変 • 実機のUEFI実装にはバグがあるかも。 エミュレータでの動作と比較検証大事。