系统调用的实现嗯



源代码在这里

我评论了我对的理解

type mmapper struct {
sync.Mutex
active map[*byte][]byte // active mappings; key is last byte in mapping
mmap   func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
munmap func(addr uintptr, length uintptr) error
}
func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
if length <= 0 {
return nil, EINVAL
}
// Map the requested memory using a operating-system dependent function
addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
if errno != nil {
return nil, errno
}
// Create slice memory layout
var sl = struct {
addr uintptr
len  int
cap  int
}{addr, length, length}
// Cast it to byte slice
b := *(*[]byte)(unsafe.Pointer(&sl))
// ??
p := &b[cap(b)-1]
m.Lock()
defer m.Unlock()
m.active[p] = b
return b, nil
}
func (m *mmapper) Munmap(data []byte) (err error) {
if len(data) == 0 || len(data) != cap(data) {
return EINVAL
}
// Check if the slice is valid ?
p := &data[cap(data)-1]
m.Lock()
defer m.Unlock()
b := m.active[p]
if b == nil || &b[0] != &data[0] {
return EINVAL
}
// Unmap the memory and update m.
if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
return errno
}
delete(m.active, p)
return nil
}

所以我的问题只是关于字段mmapper.active,我不明白它是用来做什么的。

我已经读到了uintptr和垃圾收集器的一些问题,也许是为了避免它们?或者可能只是为了在调用Munmap时验证切片?

它可能是一个切片的一个切片,那么它的备份指针将与原始指针不同。这张地图可以让我们检查这个切片是否被切片。

b := []byte{1,2,3,4}
fmt.Println(&b[0]) // 0x40e020
b = b[1:]
fmt.Println(&b[0]) // 0x40e021

https://play.golang.org/p/WJogLiMOfj7

最新更新