LLVMのEFI Byte Codeバックエンドを作る

ここでは開発しているLLVMEFI Byte Code (EBC)バックエンドの概要と EBCバックエンド固有の問題などについてみていく.

ソースコードは以下で公開している.

続きを読む

文鎮化したMinnowboardを復旧させる

MinnowboardIntel Atomを搭載した シングルボードコンピュータである. Minnowboardを使った実験で誤ったファームウェアを書き込んでしまい brick (文鎮化) させてしまったので SPI Flashを外部から書き換えることで復旧させる.

続きを読む

Linux kernelをUnikernelのライブラリ化する

Linux kernelをUnikraftのライブラリ化した. これにより機能の少ないUnikernelの資源として Linux kernelの持つ機能を利用することが可能となる.

続きを読む

正規表現からLLVM IRを生成する

正規表現は文字列マッチングなどに広く用いられている形式言語であるが, 等価な決定性有限オートマトン(DFA)に変換できることが知られている. google/redgrep は与えられた正規表現から等価なDFAに相当するネイティブコードを LLVMにより生成する. ここではredgrepを改造して 正規表現からどのようなLLVM IRが生成されるのかをみてみる.

redllというツールを追加した.コードは

に置いてある.

使い方

最初にLLVMソースコードをダウンロードして ビルドしてローカルの適当な場所にインストールしておく. redgrepは新しいLLVMを要求するのでLLVM 8.0.0あたりを入れておく. redgrepのビルドが通るようにパスを通す.

$ export LLVM_CONFIG=/path/to/bin/llvm-config

とかやってからredgrepをビルドする.

$ ./redll "regex"

で遊べる.

例: "a"

試しに正規表現パターン"a"がどのようになるのかを以下に示す.

$ ./redll "a"
; dfa is 3 states
; ModuleID = 'M'
source_filename = "M"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

; Function Attrs: norecurse nounwind readonly
define i1 @F(i8* nocapture readonly, i64) local_unnamed_addr #0 {
entry:
  %2 = icmp eq i64 %1, 0
  br i1 %2, label %return_true, label %3

return_true:                                      ; preds = %3, %entry
  ret i1 false

; <label>:3:                                      ; preds = %entry
  %4 = load i8, i8* %0, align 1
  %cond = icmp eq i8 %4, 97
  br i1 %cond, label %5, label %return_true

; <label>:5:                                      ; preds = %3
  %6 = icmp eq i64 %1, 1
  ret i1 %6
}

attributes #0 = { norecurse nounwind readonly }

ここではFという関数があり, 入力が0であればfalseを返し, そうでなければ入力から1文字取り出し 97=aであれば1=trueを返す, というような状態機械になっていることがわかる.

まとめ

他にも色々面白く遊べるはずなので試してほしい.

参考文献

技術書典6で新刊「UEFI読本 GRUB編」を頒布

2019年4月14日に池袋サンシャインシティで開催される 技術書典6において「海洋軟件」として 新刊「UEFI読本 GRUB編」を頒布する。 既刊「UEFI読本 基礎編 Linux編」も基礎編を分離し 「UEFI読本 Linux編」として頒布する。 配置先は「う27」である。

続きを読む

春の秋山郷の行き方 (2019年3月版)

2019年3月21日から24日かけて開催された「カーネルVMキャンプ #9」[1]に参加した. 開催場所は秋山郷結東温泉「かたくりの宿」という元小学校校舎の宿[2]である. 東京から「かたくりの宿」までの公共交通機関でのアクセスがやや変則的なのでここにまとめておく.

概要

「かたくりの宿」のWebページに書かれている通り,東京からは以下の通りの行程となる[3].

  • 東京 - (上越新幹線) -> 越後湯沢
  • 越後湯沢 - (急行バス森宮野原行) -> 津南役場前
  • 津南役場前 - (見玉行バス) -> 見玉
  • 見玉 - (デマンドタクシー) -> かたくりの宿

前日17:00までにタクシーの予約

基本この通りに行けばいいのだが, デマンドタクシーを前日17:00までに予約する必要がある[4]. タクシーとはいうものの,1日3本の片道300円の路線バスの延長のようなものである. なお,私はこの事実に前日16:58に気づき電話で予約した.危なかった.

越後湯沢から見玉まで

JR越後湯沢駅を降り,東口4番から急行森宮野原行のバズに乗車,津南役場前で降車. 津南役場前から見玉行のバスに乗車,見玉で降車. ここまでは案内の通りに行けるはずである. なお,電子マネーは利用できず,かつ五千円札や一万円札での支払いは車内でできないため, 事前に崩して小銭を作るか乗車券を案内所で購入しておく必要がある.

f:id:retrage01:20190326022106j:plain
越後湯沢東口 右奥が4番乗り場

f:id:retrage01:20190326022121j:plain
津南役場前バス停 ここで見玉行を待つ

見玉からかたくりの宿まで

事前に予約したデマンドタクシーが来るはずなので,それに乗ればかたくりの宿まで連れて行ってくれる. デマンドタクシーは見玉までのバスから乗り継ぎができるように時刻表が組まれている. なので,例えば11:49見玉着であれば11:50のデマンドタクシーはバスの到着を待ってくれるはずである.

f:id:retrage01:20190326022209j:plain
見玉 左に自販機と土産物屋がある

f:id:retrage01:20190326022228j:plain
見玉バス停

私の場合

しかし,私はこの事実に気づかなかったため,遅い14:30見玉発のデマンドタクシーを予約してしまい, かつ11:49見玉着のバスに乗ってしまったため,2時間半ほど見玉でデマンドタクシーを待つことになった. 完全にアホである.

見玉には見玉不動尊とその周辺に土産物屋がいくつかある. が,冬季のためか土産物屋は全て閉まっており,かつ見玉不動尊も雪で覆われていて奥まで見ることができなかった. 幸いなことにdocomo回線は繋がっていて,バス停の裏の屋根のある場所にベンチを見つけたため, その場で作業をしつつ[5][6]バスを待つことができた.

f:id:retrage01:20190326022237j:plainf:id:retrage01:20190326022252j:plainf:id:retrage01:20190326022302j:plainf:id:retrage01:20190326022309j:plain
見玉不動尊 雪で奥まで行けなかった

f:id:retrage01:20190326022329j:plain
バス停裏にあったスペース ここのベンチで作業しつつバスを待った

参考文献