speedup loading

This commit is contained in:
2025-12-02 14:21:40 +01:00
parent c134c3b7cc
commit 0b330bedd2

View File

@@ -173,14 +173,13 @@ fn loadStaticElf(ehdr: elf.Header, file_reader: *std.fs.File.Reader) !usize {
const base = try posix.mmap( const base = try posix.mmap(
hint, hint,
maxva - minva, maxva - minva,
posix.PROT.NONE, posix.PROT.WRITE,
.{ .TYPE = .PRIVATE, .ANONYMOUS = true, .FIXED_NOREPLACE = !dynamic }, .{ .TYPE = .PRIVATE, .ANONYMOUS = true, .FIXED_NOREPLACE = !dynamic },
-1, -1,
0, 0,
); );
log.debug("Pre-flight reservation at: {*}, size: 0x{x}", .{ base.ptr, base.len }); log.debug("Pre-flight reservation at: {*}, size: 0x{x}", .{ base.ptr, base.len });
const flags = posix.MAP{ .TYPE = .PRIVATE, .ANONYMOUS = true, .FIXED = true };
var phdrs = ehdr.iterateProgramHeaders(file_reader); var phdrs = ehdr.iterateProgramHeaders(file_reader);
var phdr_idx: u32 = 0; var phdr_idx: u32 = 0;
errdefer posix.munmap(base); errdefer posix.munmap(base);
@@ -197,17 +196,7 @@ fn loadStaticElf(ehdr: elf.Header, file_reader: *std.fs.File.Reader) !usize {
" - phdr[{}]: mapping 0x{x} - 0x{x} (vaddr=0x{x}, dyn_base=0x{x})", " - phdr[{}]: mapping 0x{x} - 0x{x} (vaddr=0x{x}, dyn_base=0x{x})",
.{ phdr_idx, start, start + size, phdr.p_vaddr, base_for_dyn }, .{ phdr_idx, start, start + size, phdr.p_vaddr, base_for_dyn },
); );
// NOTE: We can't use a single file-backed mmap for the segment, because p_memsz may be const ptr: []align(page_size) u8 = @as([*]align(page_size) u8, @ptrFromInt(start))[0..size];
// larger than p_filesz. This difference accounts for the .bss section, which must be
// zero-initialized.
const ptr = try posix.mmap(
@as(?[*]align(page_size) u8, @ptrFromInt(start)),
size,
posix.PROT.WRITE,
flags,
-1,
0,
);
try file_reader.seekTo(phdr.p_offset); try file_reader.seekTo(phdr.p_offset);
if (try file_reader.read(ptr[offset..][0..phdr.p_filesz]) != phdr.p_filesz) if (try file_reader.read(ptr[offset..][0..phdr.p_filesz]) != phdr.p_filesz)
return UnfinishedReadError.UnfinishedRead; return UnfinishedReadError.UnfinishedRead;