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

示例

-- 载入一个RV32镜像并执行若干步
local ctx, err = ndk.rv32i("/luadb/app.bin", 32 * 1024, 1024)
if not ctx then
    log.error("ndk", err)
    return
end
local ok, ret = ndk.exec(ctx, {steps = 100000, elapsed = 500})
if ok then
    log.info("ndk", "retval", ret)
end

ndk.rv32i(path, mem_size, exchange_size)#

创建并加载一个RV32镜像

参数

传入值类型

解释

string

path 镜像路径

int

mem_size 可选,沙盒RAM大小,默认 LUAT_NDK_DEFAULT_RAM_SIZE

int

exchange_size 可选,交换区大小,默认 LUAT_NDK_DEFAULT_EXCHANGE_SIZE

返回值

返回值类型

解释

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},步数为0使用默认预算

int

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

返回值

返回值类型

解释

boolean,int

成功返回 true,retval;失败返回 false,err,mcause,mtval

例子


ndk.reset(ctx)#

重置沙箱并重新加载镜像

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

返回值

返回值类型

解释

boolean

成功返回 true,失败返回 false,err

例子


ndk.thread(ctx, opts, elapsed_us)#

在独立线程异步执行镜像

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

int|table

opts 步数或表 {steps=步数, elapsed=每步时间us}

int

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

返回值

返回值类型

解释

int

线程ID,失败返回 nil,err

例子


ndk.stop(ctx, wait_ms)#

请求停止异步线程

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

int

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

返回值

返回值类型

解释

boolean

成功返回 true,失败返回 false,err

例子


ndk.info(ctx)#

获取当前运行状态

参数

传入值类型

解释

userdata

ctx ndk.rv32i 返回的上下文

返回值

返回值类型

解释

table

包含 mem/exchange/exchange_addr/image/running/mcause/mtval

例子