系統呼叫

系統呼叫不在 WebAssembly 規格內,是 WasmVM 特有的功能,可以讓 WebAssembly 直接對作業系統輸出/輸入等等的操作

系統呼叫的機制是先在堆疊中放入指定的參數,再透過 unreachable 指令調用系統呼叫

系統呼叫目前只支援 Linux 作業系統,Windows 和 Mac 無法使用

編譯 WasmVM

先前在編譯時有把系統呼叫功能關掉,現在要把他打開

  • 到 build 資料夾 (如果已經在 build 資料夾可以跳過這一步)

    cd build
  • 執行 CMake

cmake -DCMAKE_BUILD_TYPE=Debug -DUSE_SYSCALL=ON ..

一樣使用 Debug 模式,但是把系統呼叫打開

在打開系統呼叫之後,unreachable 就會用來調用系統呼叫,不能再拿來輸出堆疊中的數值

  • 執行 Make 編譯程式

make -B

使用系統呼叫

在這個簡化版中,只有 3 個系統呼叫

一般版中會支援更多系統呼叫,使用方式基本上相差不大

SYS_stdin

從終端機的標準輸入,讀取資料到記憶體

  • 編號: 0

  • 參數

名稱

型別

記憶體位置

i32

讀取長度

i32

  • 回傳值

    • 一個 i32 數值,成功的話回傳實際讀取長度,失敗的話回傳 -1

範例程式

(module
(memory 1)
(func $main (local i32)
i32.const 0
i32.const 10
i32.const 0
unreachable
drop
i32.const 0
i32.const 10
i32.const 1
unreachable
drop
)
(start $main)
)

第一個 i32.const 是記憶體位置 0

第二個 i32.const 讀取長度 10

第三個 i32.const 是 SYS_stdin 的編號 0

執行後會把鍵盤輸入的字顯示出來

SYS_stdout

將記憶體中的資料,寫到終端機的標準輸出

  • 編號: 1

  • 參數

名稱

型別

記憶體位置

i32

讀取長度

i32

  • 回傳值

    • 一個 i32 數值,成功的話回傳實際寫入長度,失敗的話回傳 -1

範例程式

(module
(memory (data "Hello\n"))
(func $main
i32.const 0
i32.const 6
i32.const 1
unreachable
drop
)
(start $main)
)

第一個 i32.const 是記憶體位置 0

第二個 i32.const 讀取長度 6

第三個 i32.const 是 SYS_stdout 的編號 1

執行結果

Hello

SYS_stderr

將記憶體中的資料,寫到終端機的標準錯誤輸出

  • 編號: 2

  • 參數

名稱

型別

記憶體位置

i32

讀取長度

i32

  • 回傳值

    • 一個 i32 數值,成功的話回傳實際寫入長度,失敗的話回傳 -1

範例程式

(module
(memory (data "Hello\n"))
(func $main
i32.const 0
i32.const 6
i32.const 2
unreachable
drop
)
(start $main)
)

第一個 i32.const 是記憶體位置 0

第二個 i32.const 讀取長度 6

第三個 i32.const 是 SYS_stderr 的編號 2

執行結果

Hello