Open3

WasmLinux: とりあえず起動だけする方法を考える

okuokuokuoku

とりあえずwasm2cで直接Cソースに戻し、適当なランタイムと接続して動かすことにする。 この方法ならホストのsetjmpとlongjmpを使えるため

initの収集とかも考えないといけないんだけど良い方法が全然思い浮ばない。一旦C++ constructorに寄せるのが良いか。。?

okuokuokuoku

host callの準備

とりあえずいつものNCCC形式で。

https://github.com/okuoku/lkl-wasm/blob/0331c2f298340658567a4a5bb6fcc88130a0b3d2/_hostwasm/hostwasm_lklops.c

まだ何も実装していない状態。

https://github.com/okuoku/lkl-wasm/blob/0331c2f298340658567a4a5bb6fcc88130a0b3d2/_hostwasm/runner/runner.cpp

この状態で起動時のbacktraceを取ると:

(lldb) bt
* thread #1, name = 'runner', stop reason = breakpoint 1.1
  * frame #0: 0x00000000009e39fd runner`w2c_env_nccc_call64
    frame #1: 0x00000000009defbe runner`w2c_lin_host_sem_alloc + 627
    frame #2: 0x00000000009dd40d runner`w2c_lin_lkl_start_kernel + 1254
    frame #3: 0x00000000009de8de runner`w2c_lin_init_0 + 138
    frame #4: 0x0000000000402882 runner`w2c_lin_init + 24
    frame #5: 0x00000000009e3ab9 runner`main + 45
    frame #6: 0x00007ffff7a49b8a libc.so.6`__libc_start_call_main + 122
    frame #7: 0x00007ffff7a49c4b libc.so.6`__libc_start_main@@GLIBC_2.34 + 139
    frame #8: 0x0000000000401245 runner`_start + 37

ちゃんと lkl_start_kernel から sem_alloc が呼ばれることがわかる。

https://github.com/lkl/linux/blob/31a835e54b32bc76cde50f41aab41285ab9053d9/arch/lkl/kernel/setup.c#L91

okuokuokuoku

ホストオブジェクトの収集

ホスト側の同期オブジェクトやスレッド、TLSはC++20でどうにかしたい。このとき、LKL側が32bitなので何らかの方法でハンドルを管理してやる必要がある。C++20で実装しないといけないオブジェクトは:

"ホストオブジェクト" はこれらの union として実装し、 0 〜 4095 までのIDを振って管理することにする。

さらに、いわゆる malloc と free も実装してやる必要がある。まぁ一旦64MiBとかでっかく取ってmempoolite https://github.com/jefyt/mempoolite あたりで良いかな。。