golang:32位访问mmap'd“/ dev / mem”区域

时间:2014-02-09 08:20:49

标签: go

由于golang是一种系统语言,因此它应该能够执行一些用户空间硬件驱动程序工作。

我想mmap“/ dev / mem”并对一些内存映射的pci寄存器进行一些读写操作。 由于golang的syscall.Mmap返回一个字节数组。我怎么可能对寄存器执行32位(例如)读或写操作?

由于某些寄存器仅支持32位访问,因此逐字节访问不是重要的。

2 个答案:

答案 0 :(得分:4)

您可以使用unsafe并在右侧偏移量处获取*uint32指针来执行此操作。这是一个常规字节数组的例子,但mmap的一个应该是相同的。

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    a := make([]byte, 30)
    p := (*uint32)(unsafe.Pointer(&a[8]))
    *p = 0xabcd0123
    fmt.Println(a)
}

答案 1 :(得分:0)

这里是一个例子。别客气。 ;)

func Readu32(baseAddress int64, offset int64) uint32 {
        var value uint32 = 0xFFFFFFFF
        const bufferSize int = 4096

        file, err := os.Open("/dev/mem")
        if err != nil {
                log.Fatal(err)
        }

        defer file.Close()
        mmap, err := syscall.Mmap(int(file.Fd()), baseAddress, bufferSize, syscall.PROT_READ, syscall.MAP_SHARED)

        if err != nil {
                log.Fatal(err)
        }
        value = *(*uint32)(unsafe.Pointer(&mmap[offset]))
        err = syscall.Munmap(mmap)
        if err != nil {
                log.Fatal(err)
        }
        return value
}