stage0 重构vm使其依赖自己的地址空间不再共用宿主机 修改vm的ABI 修正相关nob构建问题

This commit is contained in:
zzy committed 2026-09-22 23:12:15 +08:00
1 parent fae017b52d
commit c0a86ea552
14 files changed
+2149 -1572

No files matched your search

+34 -25
View File
@@ -545,10 +545,8 @@ fn put_name_field(out: *ByteBuffer, name: ByteView): bool {
ret put_zeros(out, align8(nlen) - nlen);
}
fn store(self: *Prog, path: ByteView): Status {
var out = ByteBuffer.new();
defer { ByteBuffer.drop(&out); }
// 把 prog 序列化为二进制写入 out(不落盘,供内嵌 VM 直接用)。
fn encode(self: *Prog, out: *ByteBuffer): Status {
// 精确预估输出大小并一次性预留,避免大文件逐字节增长导致的重复拷贝。
var total: usize = 48;
var fi: usize = 0;
@@ -581,11 +579,11 @@ fn store(self: *Prog, path: ByteView): Status {
if e != null { total = total + 8 + align8(e.storage.len); }
fi = fi + 1;
}
match ByteBuffer.reserve(&out, total) { .Ok => {}, .Err(error) => {} }
match ByteBuffer.reserve(out, total) { .Ok => {}, .Err(error) => {} }
if out.storage.cap < total || out.storage.data == null { ret .Err(make(.Io)); }
if !put_view(&out, ByteView.from_slice("SPLBIN")) { ret .Err(make(.Io)); }
if !put_zeros(&out, 2) { ret .Err(make(.Io)); }
if !put_view(out, ByteView.from_slice("SPLBIN")) { ret .Err(make(.Io)); }
if !put_zeros(out, 2) { ret .Err(make(.Io)); }
var nfuncs = self.funcs.len;
var ninsns = self.insns.len;
@@ -594,21 +592,21 @@ fn store(self: *Prog, path: ByteView): Status {
var ndata: usize = 0;
if self.gdata.len > 0 { ndata = self.gdata.len - 1; }
if !put_u64(&out, nfuncs) { ret .Err(make(.Io)); }
if !put_u64(&out, ninsns) { ret .Err(make(.Io)); }
if !put_u64(&out, nnatives) { ret .Err(make(.Io)); }
if !put_u64(&out, nstrs) { ret .Err(make(.Io)); }
if !put_u64(&out, ndata) { ret .Err(make(.Io)); }
if !put_u64(out, nfuncs) { ret .Err(make(.Io)); }
if !put_u64(out, ninsns) { ret .Err(make(.Io)); }
if !put_u64(out, nnatives) { ret .Err(make(.Io)); }
if !put_u64(out, nstrs) { ret .Err(make(.Io)); }
if !put_u64(out, ndata) { ret .Err(make(.Io)); }
var i: usize = 0;
while i < nfuncs {
var f = func_at(self, i);
if f == null { ret .Err(make(.Io)); }
if !put_name_field(&out, f.name) { ret .Err(make(.Io)); }
if !put_u64(&out, f.idx_of_strtab) { ret .Err(make(.Io)); }
if !put_u64(&out, f.nargs) { ret .Err(make(.Io)); }
if !put_u64(&out, f.ninsns) { ret .Err(make(.Io)); }
if !put_u64(&out, f.address) { ret .Err(make(.Io)); }
if !put_name_field(out, f.name) { ret .Err(make(.Io)); }
if !put_u64(out, f.idx_of_strtab) { ret .Err(make(.Io)); }
if !put_u64(out, f.nargs) { ret .Err(make(.Io)); }
if !put_u64(out, f.ninsns) { ret .Err(make(.Io)); }
if !put_u64(out, f.address) { ret .Err(make(.Io)); }
i = i + 1;
}
@@ -627,17 +625,17 @@ fn store(self: *Prog, path: ByteView): Status {
while i < nnatives {
var n = native_at(self, i);
if n == null { ret .Err(make(.Io)); }
if !put_name_field(&out, n.name) { ret .Err(make(.Io)); }
if !put_u64(&out, n.idx_of_strtab) { ret .Err(make(.Io)); }
if !put_name_field(out, n.name) { ret .Err(make(.Io)); }
if !put_u64(out, n.idx_of_strtab) { ret .Err(make(.Io)); }
i = i + 1;
}
i = 0;
while i < nstrs {
var s = str_at(self, i);
if !put_u64(&out, s.len) { ret .Err(make(.Io)); }
if !put_view(&out, s) { ret .Err(make(.Io)); }
if !put_zeros(&out, align8(s.len) - s.len) { ret .Err(make(.Io)); }
if !put_u64(out, s.len) { ret .Err(make(.Io)); }
if !put_view(out, s) { ret .Err(make(.Io)); }
if !put_zeros(out, align8(s.len) - s.len) { ret .Err(make(.Io)); }
i = i + 1;
}
@@ -646,11 +644,22 @@ fn store(self: *Prog, path: ByteView): Status {
var e = gdata_at(self, i);
if e == null { ret .Err(make(.Io)); }
var dsize = e.storage.len;
if !put_u64(&out, dsize) { ret .Err(make(.Io)); }
if !put_view(&out, ByteView.from_slice(ByteBuffer.as_slice(e.*))) { ret .Err(make(.Io)); }
if !put_zeros(&out, align8(dsize) - dsize) { ret .Err(make(.Io)); }
if !put_u64(out, dsize) { ret .Err(make(.Io)); }
if !put_view(out, ByteView.from_slice(ByteBuffer.as_slice(e.*))) { ret .Err(make(.Io)); }
if !put_zeros(out, align8(dsize) - dsize) { ret .Err(make(.Io)); }
i = i + 1;
}
ret .Ok;
}
fn store(self: *Prog, path: ByteView): Status {
var out = ByteBuffer.new();
defer { ByteBuffer.drop(&out); }
match encode(self, &out) {
.Ok => {},
.Err(error) => { ret .Err(error); },
}
var f = open_cstr(path, ByteView.from_slice("wb"));
if !File.valid(&f) { ret .Err(make(.Io)); }