A computer system has a microprocessor that can execute in a non-privileged
user mode and a privileged kernel mode. A user virtual address space is
used when the microprocessor is in the user mode, and a kernel virtual
address space is used when the microprocessor is in the kernel mode. Each
of the address spaces has the same range of virtual addresses that is
designated for shared components. The user virtual address space is mapped
to an offset position within the kernel address space. When a user process
calls a kernel function with a pointer argument, the pointer is biased
before being dereferenced to account for the offset of the user address
space within the kernel address space. This allows for sharing of
position-dependent code, while still allowing the kernel to access the
entire user address space.