mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
Initialize Go memory allocator
This commit is contained in:
parent
b4f4a9a738
commit
effc6710d9
@ -5,6 +5,7 @@ package goruntime
|
|||||||
import (
|
import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/achilleasa/gopher-os/kernel"
|
||||||
"github.com/achilleasa/gopher-os/kernel/mem"
|
"github.com/achilleasa/gopher-os/kernel/mem"
|
||||||
"github.com/achilleasa/gopher-os/kernel/mem/pmm/allocator"
|
"github.com/achilleasa/gopher-os/kernel/mem/pmm/allocator"
|
||||||
"github.com/achilleasa/gopher-os/kernel/mem/vmm"
|
"github.com/achilleasa/gopher-os/kernel/mem/vmm"
|
||||||
@ -14,8 +15,12 @@ var (
|
|||||||
mapFn = vmm.Map
|
mapFn = vmm.Map
|
||||||
earlyReserveRegionFn = vmm.EarlyReserveRegion
|
earlyReserveRegionFn = vmm.EarlyReserveRegion
|
||||||
frameAllocFn = allocator.AllocFrame
|
frameAllocFn = allocator.AllocFrame
|
||||||
|
mallocInitFn = mallocInit
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//go:linkname mallocInit runtime.mallocinit
|
||||||
|
func mallocInit()
|
||||||
|
|
||||||
//go:linkname mSysStatInc runtime.mSysStatInc
|
//go:linkname mSysStatInc runtime.mSysStatInc
|
||||||
func mSysStatInc(*uint64, uintptr)
|
func mSysStatInc(*uint64, uintptr)
|
||||||
|
|
||||||
@ -100,6 +105,30 @@ func sysAlloc(size uintptr, sysStat *uint64) unsafe.Pointer {
|
|||||||
return unsafe.Pointer(regionStartAddr)
|
return unsafe.Pointer(regionStartAddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// nanotime returns a monotonically increasing clock value. This is a dummy
|
||||||
|
// implementation and will be replaced when the timekeeper package is
|
||||||
|
// implemented.
|
||||||
|
//
|
||||||
|
// This function replaces runtime.nanotime and is invoked by the Go allocator
|
||||||
|
// when a span allocation is performed.
|
||||||
|
//
|
||||||
|
//go:redirect-from runtime.nanotime
|
||||||
|
//go:nosplit
|
||||||
|
func nanotime() uint64 {
|
||||||
|
// Use a dummy loop to prevent the compiler from inlining this function.
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init enables support for various Go runtime features. After a call to init
|
||||||
|
// the following runtime features become available for use:
|
||||||
|
// - heap memory allocation (new, make e.t.c)
|
||||||
|
func Init() *kernel.Error {
|
||||||
|
mallocInitFn()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// Dummy calls so the compiler does not optimize away the functions in
|
// Dummy calls so the compiler does not optimize away the functions in
|
||||||
// this file.
|
// this file.
|
||||||
@ -112,4 +141,5 @@ func init() {
|
|||||||
sysReserve(zeroPtr, 0, &reserved)
|
sysReserve(zeroPtr, 0, &reserved)
|
||||||
sysMap(zeroPtr, 0, reserved, &stat)
|
sysMap(zeroPtr, 0, reserved, &stat)
|
||||||
sysAlloc(0, &stat)
|
sysAlloc(0, &stat)
|
||||||
|
stat = nanotime()
|
||||||
}
|
}
|
||||||
|
@ -235,3 +235,14 @@ func TestSysAlloc(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestInit(t *testing.T) {
|
||||||
|
defer func() {
|
||||||
|
mallocInitFn = mallocInit
|
||||||
|
}()
|
||||||
|
mallocInitFn = func() {}
|
||||||
|
|
||||||
|
if err := Init(); err != nil {
|
||||||
|
t.Fatal(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ package kmain
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/achilleasa/gopher-os/kernel"
|
"github.com/achilleasa/gopher-os/kernel"
|
||||||
|
"github.com/achilleasa/gopher-os/kernel/goruntime"
|
||||||
"github.com/achilleasa/gopher-os/kernel/hal"
|
"github.com/achilleasa/gopher-os/kernel/hal"
|
||||||
"github.com/achilleasa/gopher-os/kernel/hal/multiboot"
|
"github.com/achilleasa/gopher-os/kernel/hal/multiboot"
|
||||||
"github.com/achilleasa/gopher-os/kernel/mem/pmm/allocator"
|
"github.com/achilleasa/gopher-os/kernel/mem/pmm/allocator"
|
||||||
@ -34,6 +35,8 @@ func Kmain(multibootInfoPtr, kernelStart, kernelEnd uintptr) {
|
|||||||
panic(err)
|
panic(err)
|
||||||
} else if err = vmm.Init(); err != nil {
|
} else if err = vmm.Init(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
} else if err = goruntime.Init(); err != nil {
|
||||||
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use kernel.Panic instead of panic to prevent the compiler from
|
// Use kernel.Panic instead of panic to prevent the compiler from
|
||||||
|
Loading…
x
Reference in New Issue
Block a user