我正在嘗試從 Go 代碼中發(fā)出 KVM 圖標。目前我有如下內(nèi)容:func (vm *Vm) RegisterIrqFd(efd *EventFd, gsi uint32) error { irqfd := (*C.struct_kvm_irqfd)(C.calloc(1, C.sizeof_struct_kvm_irqfd)) defer C.free(unsafe.Pointer(irqfd)) irqfd.fd = C.uint(efd.Fd()) irqfd.gsi = C.uint(gsi) if _, err := sysutils.Ioctl(vm.Fd(), C.KVM_IRQFD, uintptr(unsafe.Pointer(irqfd))); err != nil { return fmt.Errorf("RegisterIrqFd failed: %v", err) } return nil}Ioctl 函數(shù)的實現(xiàn)方式如下:func Ioctl(fd uintptr, cmd C.uint, arg uintptr) (uintptr, error) { ret, _, errno := syscall.Syscall( syscall.SYS_IOCTL, fd, uintptr(cmd), uintptr(arg), ) if int64(ret) == -1 { return ret, ErrnoToErr(errno) } return ret, nil}而埃爾諾托爾函數(shù)的實現(xiàn)方式如下:func ErrnoToErr(errno syscall.Errno) error { return fmt.Errorf("%v", errno.Error())}在內(nèi)部 獲得支持的處理器,ioctl的參數(shù),是使用 分配的。如果這是C代碼,則可以在堆棧上分配代碼。有什么辦法可以繞過使用caloc和免費使用分配嗎?有什么替代方案會更習(xí)慣嗎?cpuidC.calloccpuid有沒有辦法讓埃雷諾托埃爾返回一個與埃雷諾對應(yīng)的 go 錯誤類型?目前它使用內(nèi)部系統(tǒng)調(diào)用/syscall_unix.go;因此,它只是取消引用字符串列表并返回字符串。最好有一個類型,這樣我就可以測試單元測試中的特定錯誤。(e Errno) Error()
2 回答

當年話下
TA貢獻1890條經(jīng)驗 獲得超9個贊
只需回復(fù)更新后的示例,我們就可以這樣做:
func (vm *Vm) RegisterIrqFd(efd *EventFd, gsi uint32) error {
irqfd := C.struct_kvm_irqfd{}
irqfd.fd = C.uint(efd.Fd())
irqfd.gsi = C.uint(gsi)
if _, err := sysutils.Ioctl(vm.Fd(), C.KVM_IRQFD, uintptr(unsafe.Pointer(&irqfd))); err != nil {
return fmt.Errorf("RegisterIrqFd failed: %v", err)
}
return nil
}
我認為這是安全的,但無論如何,我們可能會發(fā)現(xiàn),因為我們把它的地址帶到這里,在這種情況下,沒有太多的節(jié)省。即便如此,只要這不違反Go指針規(guī)則(我不認為它確實如此),閱讀起來會好得多。irqfd escapes to heap
- 2 回答
- 0 關(guān)注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消