59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
//go:build unix
|
|
|
|
package mem
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
const (
|
|
PERM_NONE = syscall.PROT_NONE
|
|
PERM_READ = syscall.PROT_READ
|
|
PERM_WRITE = syscall.PROT_WRITE
|
|
PERM_EXECUTE = syscall.PROT_EXEC
|
|
)
|
|
|
|
func Reserve(total_address_space uintptr) ([]byte, error) {
|
|
data, err := syscall.Mmap(-1, 0, int(total_address_space), syscall.PROT_NONE, syscall.MAP_PRIVATE|syscall.MAP_ANON)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
func Unreserve(reserved []byte) error {
|
|
return syscall.Munmap(reserved)
|
|
}
|
|
|
|
func Commit(reserved []byte, perms int) error {
|
|
return syscall.Mprotect(reserved, perms)
|
|
}
|
|
|
|
func Decommit(committed []byte) (err error) {
|
|
err = syscall.Mprotect(committed, syscall.PROT_NONE)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return madvise(committed, syscall.MADV_DONTNEED)
|
|
}
|
|
|
|
var _zero uintptr
|
|
|
|
func madvise(b []byte, advice int) (err error) {
|
|
var _p0 unsafe.Pointer
|
|
if len(b) > 0 {
|
|
_p0 = unsafe.Pointer(&b[0])
|
|
} else {
|
|
_p0 = unsafe.Pointer(&_zero)
|
|
}
|
|
|
|
_, _, e := syscall.Syscall(syscall.SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))
|
|
if e != 0 {
|
|
err = syscall.Errno(e)
|
|
}
|
|
|
|
return
|
|
}
|