mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
By setting up pwd as a Go workspace, we can trim import paths from something like "github.com/achilleasa/gopher-os/kernel" to just "kernel". These changes make forking easier and also allows us to move the code to a different git hosting provider without having to rewrite the imports.
36 lines
1.2 KiB
Go
36 lines
1.2 KiB
Go
package vmm
|
|
|
|
import (
|
|
"gopheros/kernel"
|
|
"gopheros/kernel/mem"
|
|
)
|
|
|
|
var (
|
|
// earlyReserveLastUsed tracks the last reserved page address and is
|
|
// decreased after each allocation request. Initially, it points to
|
|
// tempMappingAddr which coincides with the end of the kernel address
|
|
// space.
|
|
earlyReserveLastUsed = tempMappingAddr
|
|
|
|
errEarlyReserveNoSpace = &kernel.Error{Module: "early_reserve", Message: "remaining virtual address space not large enough to satisfy reservation request"}
|
|
)
|
|
|
|
// EarlyReserveRegion reserves a page-aligned contiguous virtual memory region
|
|
// with the requested size in the kernel address space and returns its virtual
|
|
// address. If size is not a multiple of mem.PageSize it will be automatically
|
|
// rounded up.
|
|
//
|
|
// This function allocates regions starting at the end of the kernel address
|
|
// space. It should only be used during the early stages of kernel initialization.
|
|
func EarlyReserveRegion(size mem.Size) (uintptr, *kernel.Error) {
|
|
size = (size + (mem.PageSize - 1)) & ^(mem.PageSize - 1)
|
|
|
|
// reserving a region of the requested size will cause an underflow
|
|
if uintptr(size) > earlyReserveLastUsed {
|
|
return 0, errEarlyReserveNoSpace
|
|
}
|
|
|
|
earlyReserveLastUsed -= uintptr(size)
|
|
return earlyReserveLastUsed, nil
|
|
}
|