Не определено: syscall.Mmap в Windows 10 - PullRequest
0 голосов
/ 01 октября 2018

У меня есть эта функция в моем проекте Go, и я получаю сообщение об ошибке:

undefined 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 голосов
/ 01 октября 2018

Проблема

В Windows нет * syscall mmap(2) - , это зависит от POSIX (на всякий случай: что такое "POSIX" ).

У 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.Предполагается, что такая реализация должна включать использование так называемых ограничений сборки для условной компиляции конкретной целевой реализации конкретной платформы, как это делает golang.org/x/exp/mmap.

...