Files
system-programming/chp9/README.md
2025-08-11 15:17:21 +02:00

105 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Chapter 9 - Memory Management
This document summarizes the key concepts from **Chapter 9: Memory Management** in *Linux System Programming, 2nd Edition* by Robert Love.
---
## Overview
Memory management in Linux involves allocating, using, and freeing memory efficiently while avoiding leaks and fragmentation. This chapter explains how user-space programs interact with the kernels memory manager through system calls, library functions, and advanced allocation techniques.
---
## Key Topics
### 1. Memory Layout of a Process
A typical Linux process memory layout includes:
- **Text Segment** Executable code of the program (read-only).
- **Data Segment** Initialized global and static variables.
- **BSS Segment** Uninitialized global and static variables.
- **Heap** Dynamically allocated memory (via `malloc`, `calloc`, `realloc`).
- **Stack** Function call frames, local variables.
- **Memory Mappings** Shared libraries, `mmap` allocations, etc.
---
### 2. Dynamic Memory Allocation
- **malloc(size_t size)** Allocates memory but leaves it uninitialized.
- **calloc(size_t nmemb, size_t size)** Allocates and zeroes memory.
- **realloc(void *ptr, size_t size)** Resizes a previously allocated block.
- **free(void *ptr)** Frees allocated memory.
#### Common pitfalls
- **Memory leaks** Forgetting to free memory.
- **Double free** Calling `free` twice on the same pointer.
- **Use-after-free** Accessing memory after it has been freed.
---
### 3. `brk` and `sbrk`
- Low-level system calls to manage the program break (end of the data segment).
- Rarely used directly; `malloc` and friends handle these internally.
---
### 4. Memory Mapping with `mmap`
- **mmap()** maps files or anonymous memory into the process address space.
- Advantages:
- Direct file access without extra copy operations.
- Efficient large memory allocations.
- Common use cases:
- Loading large files.
- Shared memory between processes.
- Paired with `munmap()` to release mappings.
---
### 5. Memory Locking
- **mlock() / mlockall()** Lock memory pages into RAM to avoid swapping.
- Useful for:
- Real-time applications.
- Security-sensitive data (e.g., cryptographic keys).
---
### 6. Advanced Memory Techniques
- **mprotect()** Change protection (read, write, execute) of memory regions.
- **shm_open() / shm_unlink()** POSIX shared memory objects.
- **posix_memalign()** Allocate memory aligned to a specified boundary.
---
### 7. Debugging Memory Issues
- Tools like **valgrind** and **AddressSanitizer** help detect:
- Memory leaks.
- Invalid reads/writes.
- Use-after-free errors.
- Good practices:
- Always initialize pointers.
- Free resources in reverse order of allocation.
---
## Key Takeaways
- Understand the process memory layout to avoid common pitfalls.
- Use the right allocation function for your needs.
- Prefer `mmap` for large or shared allocations.
- Memory debugging tools are essential for writing reliable code.
---
## References
- *Linux System Programming, 2nd Edition* Robert Love, OReilly Media.
- `man malloc`, `man mmap`, `man mprotect`, `man mlock`