gvisor/pkg/sentry/usermem
Nicolas Lacasse 9c9386d2a8 CopyObjectOut should allocate a byte slice the size of the encoded object.
This adds an extra Reflection call to CopyObjectOut, but avoids many small
slice allocations if the object is large, since without this we grow the
backing slice incrementally as we encode more data.

PiperOrigin-RevId: 233110960
Change-Id: I93569af55912391e5471277f779139c23f040147
2019-02-08 13:00:00 -08:00
..
BUILD Remove license comments 2019-01-31 11:12:53 -08:00
README.md Format documentation 2018-07-12 10:37:21 -07:00
access_type.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
addr.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
addr_range_seq_test.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
addr_range_seq_unsafe.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
bytes_io.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
bytes_io_unsafe.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
usermem.go CopyObjectOut should allocate a byte slice the size of the encoded object. 2019-02-08 13:00:00 -08:00
usermem_arm64.go Add usermem support for arm64 platform. 2019-01-07 15:40:26 -08:00
usermem_test.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00
usermem_x86.go Use correct company name in copyright header 2018-10-19 16:35:11 -07:00

README.md

This package defines primitives for sentry access to application memory.

Major types:

  • The IO interface represents a virtual address space and provides I/O methods on that address space. IO is the lowest-level primitive. The primary implementation of the IO interface is mm.MemoryManager.

  • IOSequence represents a collection of individually-contiguous address ranges in a IO that is operated on sequentially, analogous to Linux's struct iov_iter.

Major usage patterns:

  • Access to a task's virtual memory, subject to the application's memory protections and while running on that task's goroutine, from a context that is at or above the level of the kernel package (e.g. most syscall implementations in syscalls/linux); use the kernel.Task.Copy* wrappers defined in kernel/task_usermem.go.

  • Access to a task's virtual memory, from a context that is at or above the level of the kernel package, but where any of the above constraints does not hold (e.g. PTRACE_POKEDATA, which ignores application memory protections); obtain the task's mm.MemoryManager by calling kernel.Task.MemoryManager, and call its IO methods directly.

  • Access to a task's virtual memory, from a context that is below the level of the kernel package (e.g. filesystem I/O); clients must pass I/O arguments from higher layers, usually in the form of an IOSequence. The kernel.Task.SingleIOSequence and kernel.Task.IovecsIOSequence functions in kernel/task_usermem.go are convenience functions for doing so.