我正在尝试在 Linux 上进行直接 I/O,所以我需要创建内存对齐缓冲区。我复制了一些代码来做到这一点,但我不明白它是如何工作的:
package main
import (
"fmt"
"golang.org/x/sys/unix"
"unsafe"
"yottaStore/yottaStore-go/src/yfs/test/utils"
)
const (
AlignSize = 4096
BlockSize = 4096
)
// Looks like dark magic
func Alignment(block []byte, AlignSize int) int {
return int(uintptr(unsafe.Pointer(&block[0])) & uintptr(AlignSize-1))
}
func main() {
path := "/path/to/file.txt"
fd, err := unix.Open(path, unix.O_RDONLY|unix.O_DIRECT, 0666)
defer unix.Close(fd)
if err != nil {
panic(err)
}
file := make([]byte, 4096*2)
a := Alignment(file, AlignSize)
offset := 0
if a != 0 {
offset = AlignSize - a
}
file = file[offset : offset+BlockSize]
n, readErr := unix.Pread(fd, file, 0)
if readErr != nil {
panic(readErr)
}
fmt.Println(a, offset, offset+utils.BlockSize, len(file))
fmt.Println("Content is: ", string(file))
}
我知道我正在生成一个比我需要的大两倍的切片,然后从中提取一个内存对齐的块,但是这个Alignment函数对我来说没有意义。
该功能如何Alignment
运作?
如果我尝试执行fmt.Println
该函数的中间步骤,我会得到不同的结果,为什么?我猜是因为观察它会改变它的内存对齐方式(就像在量子物理学中一样:D)
沧海一幻觉
相关分类