ndk - 在沙盒化的RV32环境中运行MiniRV32IMA镜像#

示例

-- 最小生命周期: create -> info -> setData -> exec -> getData -> stop/reset -> release
local ctx, err = ndk.rv32i("/luadb/baremetal.bin", 32 * 1024, 1024)
if not ctx then
    log.error("ndk", err)
    return
end
local info = ndk.info(ctx)
log.info("ndk", "mem", info.mem, "exchange", info.exchange, "abi", info.abi_version, "features", info.features, "last_error", info.last_error)
ndk.setData(ctx, "ping")
local ok, ret, mcause, mtval = ndk.exec(ctx, {steps = 100000, elapsed = 500})
if not ok then
    log.error("ndk", ret, mcause, mtval)
    ndk.stop(ctx, 1000)
    return
end
log.info("ndk", "retval", ret, "data", ndk.getData(ctx, 16, 0))
ndk.stop(ctx, 1000) -- 空闲态也可安全调用
ndk.reset(ctx)
ctx = nil
collectgarbage("collect")

ndk.rv32i(path, mem_size, exchange_size, opts)#

创建并加载一个RV32镜像

参数

传入值类型

解释

string

path 镜像路径

int

mem_size 可选,沙盒RAM大小,默认 8 KiB,最大 512 KiB(LUAT_NDK_MAX_RAM_SIZE)

int

exchange_size 可选,交换区大小,默认 LUAT_NDK_DEFAULT_EXCHANGE_SIZE,必须小于 mem_size

table

opts 可选,目前支持 {isa=”rv32ima”|”rv32imf”}

返回值

返回值类型

解释

userdata

ctx 成功返回上下文,失败返回 nil,err

例子


ndk.setData(ctx, data, offset)#

向交换区写入数据

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

string|userdata

data 字符串或zbuff,写入交换区

int

offset 可选,起始偏移,默认0

返回值

返回值类型

解释

int

写入的字节数,失败返回 false,err

例子


ndk.getData(ctx, buff, len, offset)#

从交换区读取数据

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

userdata

buff 可选,zbuff输出缓冲

int

len 可选,读取长度,默认交换区大小或buff长度

int

offset 可选,起始偏移,默认0

返回值

返回值类型

解释

string|int

默认返回字符串,传入buff时返回读取字节数;失败返回 false,err

例子


ndk.exec(ctx, opts, elapsed_us)#

同步执行镜像指令

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

int|table

opts 步数或表 {steps=步数, elapsed=每步时间us},steps=0 表示不限步数(运行到 SYSCON 退出、ecall、trap 或 ndk.stop)

int

elapsed_us 可选,opts为数字时的步时间us

返回值

返回值类型

解释

boolean,int

成功返回 true,retval;失败返回 false,err,mcause,mtval。运行中调用会返回 busy

例子


ndk.reset(ctx)#

重置沙箱并重新加载镜像

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

返回值

返回值类型

解释

boolean

成功返回 true,失败返回 false,err。运行中/停止中调用会返回 busy

例子


ndk.thread(ctx, opts, elapsed_us)#

在独立线程异步执行镜像

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

int|table

opts 步数或表 {steps=步数, elapsed=每步时间us},steps=0 表示不限步数

int

elapsed_us 可选,opts为数字时的步时间us

返回值

返回值类型

解释

int

线程ID(递增),失败返回 nil,err。运行中/停止中调用会返回 busy

例子


ndk.stop(ctx, wait_ms)#

请求停止异步线程

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

int

wait_ms 可选,等待超时时间,默认1000

返回值

返回值类型

解释

boolean

成功返回 true,失败返回 false,err。空闲态调用为幂等成功;wait_ms=0可用于非阻塞轮询

例子


ndk.info(ctx)#

获取当前运行状态

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

返回值

返回值类型

解释

table

包含 mem/exchange/exchange_addr/image/running/mcause/mtval/abi_magic/abi_version/features/last_error/event_slots/isa/flen/fcsr/frm/fflags,便于判断生命周期状态和ABI能力

例子