由于golang是一种系统语言,因此它应该能够执行一些用户空间硬件驱动程序工作。
我想mmap“/ dev / mem”并对一些内存映射的pci寄存器进行一些读写操作。 由于golang的syscall.Mmap返回一个字节数组。我怎么可能对寄存器执行32位(例如)读或写操作?
由于某些寄存器仅支持32位访问,因此逐字节访问不是重要的。答案 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
}