feat(loader, kernel): impl part of loader and initialize kernel structure

This commit is contained in:
2026-04-11 09:42:09 +08:00
parent 1233ae9e9b
commit 34ccf69569
53 changed files with 1743 additions and 777 deletions

View File

@@ -0,0 +1,62 @@
const std = @import("std");
const processor = @import("arch").processor;
const mem = @import("arch").mem;
const PFType = mem.PFType;
const early_serial_console = @import("early_serial_console.zig");
const assert = std.debug.assert;
var pgtable_buffer: struct {
buffer: [*][mem.PAGE_SIZE]u8,
size: usize,
used_pages: usize,
} = undefined;
fn allocPgtablePage() error.OutOfMemory![4096]u8 {
// if (used + mem.PAGE_SIZE > size) {
// early_serial_console.dprint("Out of page table memory!\n", .{});
// return error.OutOfMemory;
// }
// const page = buffer + used;
// return page;
}
// fn pgdIdentInit() {
// }
// fn pudIdentInit() {
// }
fn kernelAddIdentityMap(pgdt_page: [*]mem.PGDEntry, start: u64, end: u64) void {
assert(start % mem.PMD_SIZE == 0);
assert(end % mem.PMD_SIZE == 0);
var address = start;
while (address < end) {
// var pgd = &pgdt_page[mem.PGDEntry.getIndex(address)];
// if ()
address += mem.PMD_SIZE;
}
}
export fn initializeIdentMap() void {
// var pgd_table = processor.readCr3();
// if (pgdtable == _pgtable) {
// }
}
fn printPF(msg: []const u8, errorCode: u64, faultAddress: u64, ip: u64) void {
early_serial_console.dprint(
\\{s}:
\\error code: 0x{x}
\\fault address: 0x{x}
\\instruction pointer: 0x{x}
\\
, .{msg, errorCode, faultAddress, ip});
}
export fn doBootPageFault(regs: processor.PtRegs, errorCode: u64) void {
const faultAddress = processor.readCr2();
if (errorCode & (PFType.PROT | PFType.USER | PFType.RSVD) == 0) {
printPF("Unexpected page fault", errorCode, faultAddress, regs.ip);
}
const address = faultAddress & mem.PMD_MASK;
kernelAddIdentityMap(address, address + mem.PMD_SIZE);
}