由于 golang 是一种系统语言,所以它应该能够做一些用户空间硬件驱动程序的工作。

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

逐字节访问是不合适的,因为某些寄存器仅支持 32 位访问。

最佳答案

您可以通过使用 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)
}

关于golang : 32-bit access to mmap'd "/dev/mem" region,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21656873/

10-09 15:19
查看更多