未定义:Windows 10上的syscall.Mmap

时间:2018-10-01 11:18:18

标签: go winapi system-calls

我的Go项目中具有此功能,并且出现以下错误:

  

未定义的syscall.Mmap

func memMap(fd uintptr, base int64) (mem []uint32, mem8 []byte, err error) {
    mem8, err = syscall.Mmap(
        int(fd),
        base,
        memLength,
        syscall.PROT_READ|syscall.PROT_WRITE,
        syscall.MAP_SHARED,
    )
    if err != nil {
        return
    }
    // Convert mapped byte memory to unsafe []uint32 pointer, adjust length as needed
    header := *(*reflect.SliceHeader)(unsafe.Pointer(&mem8))
    header.Len /= (32 / 8) // (32 bit = 4 bytes)
    header.Cap /= (32 / 8)
    mem = *(*[]uint32)(unsafe.Pointer(&header))
    return
}

1 个答案:

答案 0 :(得分:2)

问题

Windows没有mmap(2)系统调用-it's POSIX-specific(以防万一:what "POSIX" is)。

Windows有MapViewOfFile()和朋友。

解决方案

我认为有两种方法:

  • 使用“包装器”包,例如 golang.org/x/exp/mmap 试图提供一个通用的内存映射API 是跨平台的(也就是说,它将在POSIX平台上使用 mmap(2),并且在Windows上将使用Windows特定的API)。

  • 直接使用适当的Win32 API函数代替 syscall.Mmap

    您应该走这条路线吗, golang.org/x/sys/windows包中有 相关功能随时可用。

第三种方法是拥有自己的自定义实现 使用内存映射的数据,后者会调用 syscall.Mmap和Windows专用API的朋友。 这样的实现应该涉及使用 所谓的build constraints 有条件地编译特定于目标平台的特定对象 实施-就像golang.org/x/exp/mmap一样。