diff --git a/cpu/cpu_fallback.go b/cpu/cpu_fallback.go
index 6d7007f..089f603 100644
--- a/cpu/cpu_fallback.go
+++ b/cpu/cpu_fallback.go
@@ -1,5 +1,5 @@
-//go:build !darwin && !linux && !freebsd && !openbsd && !solaris && !windows && !dragonfly && !plan9 && !aix
-// +build !darwin,!linux,!freebsd,!openbsd,!solaris,!windows,!dragonfly,!plan9,!aix
+//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !solaris && !windows && !dragonfly && !plan9 && !aix
+// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!solaris,!windows,!dragonfly,!plan9,!aix
 
 package cpu
 
diff --git a/cpu/cpu_netbsd.go b/cpu/cpu_netbsd.go
index facc423..519ffdb 100644
--- a/cpu/cpu_netbsd.go
+++ b/cpu/cpu_netbsd.go
@@ -14,14 +14,6 @@ import (
 	"golang.org/x/sys/unix"
 )
 
-type cpuTimes struct {
-    User uint64
-	Nice uint64
-	Sys  uint64
-    Intr uint64
-	Idle uint64
-}
-
 const (
 	// sys/sysctl.h
 	ctlKern      = 1  // "high kernel": proc, limits
diff --git a/cpu/cpu_netbsd_arm64.go b/cpu/cpu_netbsd_arm64.go
index d659058..8d5cfd9 100644
--- a/cpu/cpu_netbsd_arm64.go
+++ b/cpu/cpu_netbsd_arm64.go
@@ -1,10 +1,9 @@
 package cpu
 
 type cpuTimes struct {
-	User uint64
+    User uint64
 	Nice uint64
 	Sys  uint64
-	Spin uint64
-	Intr uint64
+    Intr uint64
 	Idle uint64
 }
diff --git a/host/host_fallback.go b/host/host_fallback.go
index 585250f..a393ca1 100644
--- a/host/host_fallback.go
+++ b/host/host_fallback.go
@@ -1,5 +1,5 @@
-//go:build !darwin && !linux && !freebsd && !openbsd && !solaris && !windows
-// +build !darwin,!linux,!freebsd,!openbsd,!solaris,!windows
+//go:build !darwin && !linux && !freebsd && !openbsd && !netbsd && !solaris && !windows
+// +build !darwin,!linux,!freebsd,!openbsd,!netbsd,!solaris,!windows
 
 package host
 
diff --git a/host/host_netbsd.go b/host/host_netbsd.go
new file mode 100644
index 0000000..488f1df
--- /dev/null
+++ b/host/host_netbsd.go
@@ -0,0 +1,55 @@
+//go:build netbsd
+// +build netbsd
+
+package host
+
+import (
+	"context"
+	"strings"
+
+	"github.com/shirou/gopsutil/v3/internal/common"
+	"golang.org/x/sys/unix"
+)
+
+func HostIDWithContext(ctx context.Context) (string, error) {
+	return "", common.ErrNotImplementedError
+}
+
+func numProcs(ctx context.Context) (uint64, error) {
+	return 0, common.ErrNotImplementedError
+}
+
+func PlatformInformationWithContext(ctx context.Context) (string, string, string, error) {
+	platform := ""
+	family := ""
+	version := ""
+
+	p, err := unix.Sysctl("kern.ostype")
+	if err == nil {
+		platform = strings.ToLower(p)
+	}
+	v, err := unix.Sysctl("kern.osrelease")
+	if err == nil {
+		version = strings.ToLower(v)
+	}
+
+	return platform, family, version, nil
+}
+
+func VirtualizationWithContext(ctx context.Context) (string, string, error) {
+	return "", "", common.ErrNotImplementedError
+}
+
+func UsersWithContext(ctx context.Context) ([]UserStat, error) {
+	var ret []UserStat
+	return ret, common.ErrNotImplementedError
+}
+
+func SensorsTemperaturesWithContext(ctx context.Context) ([]TemperatureStat, error) {
+	return []TemperatureStat{}, common.ErrNotImplementedError
+}
+
+func KernelVersionWithContext(ctx context.Context) (string, error) {
+	_, _, version, err := PlatformInformationWithContext(ctx)
+	return version, err
+}
diff --git a/host/host_posix.go b/host/host_posix.go
index 24529f1..e7e0d83 100644
--- a/host/host_posix.go
+++ b/host/host_posix.go
@@ -1,5 +1,5 @@
-//go:build linux || freebsd || openbsd || darwin || solaris
-// +build linux freebsd openbsd darwin solaris
+//go:build linux || freebsd || openbsd || netbsd || darwin || solaris
+// +build linux freebsd openbsd netbsd darwin solaris
 
 package host
 
diff --git a/internal/common/common_netbsd.go b/internal/common/common_netbsd.go
new file mode 100644
index 0000000..efbc710
--- /dev/null
+++ b/internal/common/common_netbsd.go
@@ -0,0 +1,66 @@
+//go:build netbsd
+// +build netbsd
+
+package common
+
+import (
+	"os"
+	"os/exec"
+	"strings"
+	"unsafe"
+
+	"golang.org/x/sys/unix"
+)
+
+func DoSysctrl(mib string) ([]string, error) {
+	cmd := exec.Command("sysctl", "-n", mib)
+	cmd.Env = getSysctrlEnv(os.Environ())
+	out, err := cmd.Output()
+	if err != nil {
+		return []string{}, err
+	}
+	v := strings.Replace(string(out), "{ ", "", 1)
+	v = strings.Replace(string(v), " }", "", 1)
+	values := strings.Fields(string(v))
+
+	return values, nil
+}
+
+func CallSyscall(mib []int32) ([]byte, uint64, error) {
+	mibptr := unsafe.Pointer(&mib[0])
+	miblen := uint64(len(mib))
+
+	// get required buffer size
+	length := uint64(0)
+	_, _, err := unix.Syscall6(
+		unix.SYS___SYSCTL,
+		uintptr(mibptr),
+		uintptr(miblen),
+		0,
+		uintptr(unsafe.Pointer(&length)),
+		0,
+		0)
+	if err != 0 {
+		var b []byte
+		return b, length, err
+	}
+	if length == 0 {
+		var b []byte
+		return b, length, err
+	}
+	// get proc info itself
+	buf := make([]byte, length)
+	_, _, err = unix.Syscall6(
+		unix.SYS___SYSCTL,
+		uintptr(mibptr),
+		uintptr(miblen),
+		uintptr(unsafe.Pointer(&buf[0])),
+		uintptr(unsafe.Pointer(&length)),
+		0,
+		0)
+	if err != 0 {
+		return buf, length, err
+	}
+
+	return buf, length, nil
+}