---
name: "kvm_read"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/kvm_read"
---

# kvm\_read(3)

read or write kernel virtual memory

## NAME

**kvm\_read**, **kvm\_read2**, **kvm\_write** – read or write kernel virtual memory

## LIBRARY

Kernel Data Access Library (libkvm, -lkvm)

## SYNOPSIS

**#include \<kvm.h\>**

*ssize\_t*\

**kvm\_read**(*kvm\_t \*kd*, *unsigned long addr*, *void \*buf*, *size\_t nbytes*);

*ssize\_t*\

**kvm\_read2**(*kvm\_t \*kd*, *kvaddr\_t addr*, *void \*buf*, *size\_t nbytes*);

*ssize\_t*\

**kvm\_write**(*kvm\_t \*kd*, *unsigned long addr*, *const void \*buf*, *size\_t nbytes*);

## DESCRIPTION

The **kvm\_read**(), **kvm\_read2**(), and **kvm\_write**() functions are used to read and write kernel virtual memory (or a crash dump file). See **kvm\_open**(*3*) for information regarding opening kernel virtual memory and crash dumps.

The **kvm\_read**() and **kvm\_read2**() functions transfer *nbytes* bytes of data from the kernel space address *addr* to *buf*. Conversely, **kvm\_write**() transfers data from *buf* to *addr*. Unlike their SunOS counterparts, these functions cannot be used to read or write process address spaces.

The **kvm\_read2**() function uses a different type (*kvaddr\_t*) for the *addr* argument to allow use of addresses larger than ULONG\_MAX when examining non-native kernel images.

## RETURN VALUES

Upon success, the number of bytes actually transferred is returned. Otherwise, -1 is returned.

## SEE ALSO

[kvm(3)](/kvm/3.md), [kvm\_close(3)](/kvm_close/3.md), [kvm\_getargv(3)](/kvm_getargv/3.md), [kvm\_getenvv(3)](/kvm_getenvv/3.md), [kvm\_geterr(3)](/kvm_geterr/3.md), [kvm\_getprocs(3)](/kvm_getprocs/3.md), [kvm\_nlist(3)](/kvm_nlist/3.md), [kvm\_open(3)](/kvm_open/3.md), [kvm\_openfiles(3)](/kvm_openfiles/3.md)

## HISTORY

The **kvm\_read2**() function first appeared in FreeBSD 11.0.
