gvisor/pkg/sentry/usermem
Hang Su d72c63664b Accelerate byte lookup in string with `bytealg/indexbyte`
`bytealg/indexbyte` will use AVX or SSE instruction set, if possible,
which could accelerate `CopyStringIn` function by 28%.

In worst case(CPU doesn't support SSE), `bytealg/indexbyte`
will degenerate to traversal lookup. When dealing with
short strings, `bytealg/indexbyte` has the same performance level as
before.

Signed-off-by: Jianfeng Tan <henry.tjf@antfin.com>
Signed-off-by: Hang Su <darcy.sh@antfin.com>
2019-09-19 22:16:52 +08:00
..
BUILD Remove go_test from go_stateify and go_marshal 2019-09-12 15:10:17 -07:00
README.md
access_type.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -07:00
addr.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -07:00
addr_range_seq_test.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -07:00
addr_range_seq_unsafe.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -07:00
bytes_io.go Update canonical repository. 2019-06-13 16:50:15 -07:00
bytes_io_unsafe.go Update canonical repository. 2019-06-13 16:50:15 -07:00
usermem.go Accelerate byte lookup in string with `bytealg/indexbyte` 2019-09-19 22:16:52 +08:00
usermem_arm64.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -07:00
usermem_test.go Update canonical repository. 2019-06-13 16:50:15 -07:00
usermem_unsafe.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -07:00
usermem_x86.go Change copyright notice to "The gVisor Authors" 2019-04-29 14:26:23 -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.