Open3
WasmLinux: とりあえず起動だけする方法を考える
とりあえずwasm2cで直接Cソースに戻し、適当なランタイムと接続して動かすことにする。 この方法ならホストのsetjmpとlongjmpを使えるため 。
initの収集とかも考えないといけないんだけど良い方法が全然思い浮ばない。一旦C++ constructorに寄せるのが良いか。。?
host callの準備
とりあえずいつものNCCC形式で。
まだ何も実装していない状態。
この状態で起動時の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
が呼ばれることがわかる。
ホストオブジェクトの収集
ホスト側の同期オブジェクトやスレッド、TLSはC++20でどうにかしたい。このとき、LKL側が32bitなので何らかの方法でハンドルを管理してやる必要がある。C++20で実装しないといけないオブジェクトは:
- セマフォ https://cpprefjp.github.io/reference/semaphore/counting_semaphore.html
- ミューテックス https://cpprefjp.github.io/reference/mutex/mutex.html
- スレッド https://cpprefjp.github.io/reference/thread/thread.html
- TLSのキー (直接的なものは多分ないので https://cpprefjp.github.io/lang/cpp11/thread_local_storage.html で作ることになる)
- タイマー (直接的なものは無いので https://cpprefjp.github.io/reference/thread/this_thread/sleep_for.html で適当にやる)
"ホストオブジェクト" はこれらの union
として実装し、 0 〜 4095 までのIDを振って管理することにする。
さらに、いわゆる malloc と free も実装してやる必要がある。まぁ一旦64MiBとかでっかく取ってmempoolite https://github.com/jefyt/mempoolite あたりで良いかな。。