77 lines
3.2 KiB
Markdown
77 lines
3.2 KiB
Markdown
---
|
|
tags:
|
|
- memory
|
|
- Linux
|
|
- kernel
|
|
---
|
|
|
|
# Virtual memory
|
|
|
|
Virtual memory is an abstracted and idealised representation of the physical
|
|
memory capacity of a machine that is presented to user space for its memory
|
|
operations.
|
|
|
|
When an OS implements virtual memory, [processes](Processes.md) in
|
|
[user space](User_Space.md) cannot directly read or write to the physical
|
|
memory. Instead they execute memory operations against virtual memory and the
|
|
[kernel](The_kernel.md) translates these into the actual operations against
|
|
the memory hardware.
|
|
|
|
The main benefits:
|
|
|
|
- User mode processes do not have to be concerned with the physical memory
|
|
management
|
|
- There is a buffer between user mode processes and physical memory, meaning
|
|
that memory cannot be accidentally corrupted by other processes in user space.
|
|
|
|
Because the physical memory is abstracted, it can be the case that the physical
|
|
[memory addresses](Memory_addresses.md) are non-contiguous or even distributed
|
|
accross different hardware components (such as the
|
|
[cache](Register_and_cache_memory.md) and [swap](Swap_space.md)). Despite
|
|
this, the memory addresses will appear contiguous in virtual memory. Each user
|
|
space process is presented with the same range of available memory addresses and
|
|
the same total capacity.
|
|
|
|
It is also possible for the kernel to present user space with an available
|
|
virtual memory capcacity that exceeds the current physical capacity of the
|
|
machine:
|
|
|
|
> _It's possible for the kernel and all running processes to request more
|
|
> byte<!-- -->s of virtual memory than the total size of RAM. In that
|
|
> situation, the OS can move move bytes of memory to secondary storage to make
|
|
> room in RAM for newly requested memory._
|
|
|
|
_How Computers Really Work_ (2021) p.206
|
|
|
|
## Virtual memory and the kernel
|
|
|
|
The kernel itself utilises virtual memory.
|
|
|
|
During the [boot_process](Boot_process.md), it runs in physical memory mode
|
|
however it rapidly creates a 1:1 mapping of physical to virtual memory for
|
|
itself. This direct mapping allows the kernel to easily access any physical
|
|
memory location as needed, whilst retaining the benefits of virtual memory.
|
|
|
|
With its own virtual memory established, it can then build additional virtual
|
|
memory structures for itself and user processes.
|
|
|
|
While the kernel uses virtual memory it can also access physical memory at any
|
|
time wherease user space processes can only ever access virtual memory.
|
|
|
|
The kernel virtual memory has a different range of virtual addresses to work
|
|
with than user space virtual memory.
|
|
|
|
Unlike user space virtual memory, the kernel has access to everything running in
|
|
kernel address space whereas processes in user address space are partitioned
|
|
from each other with separate address spaces that cannot interact.
|
|
|
|
In addition to being able to access its own virtual memory (and physical memory,
|
|
as required) the kernel can also access any user processes' virtual address.
|
|
|
|
This said, the virtual memory space of the kernel and the virtual memory space
|
|
of the user processes are distinct. It is not the case that the kernel is
|
|
superset of all available virtual memory. It can access user space virtual
|
|
memory because it sets up the tables and locations, not because it is a subset
|
|
of its own virtual memory.
|
|
|
|

|