//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 }