【问题标题】:Undefined: syscall.Mmap on Windows 10未定义:Windows 10 上的 syscall.Mmap
【发布时间】:2018-10-01 11:18:18
【问题描述】:

我的 Go 项目中有此功能,但我收到以下错误:

未定义的系统调用.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
}

【问题讨论】:

    标签: go winapi system-calls


    【解决方案1】:

    问题

    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 所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 2020-09-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2017-04-12
      相关资源
      最近更新 更多