Simple memory allocation examples
This commit is contained in:
104
chp9/README.md
Normal file
104
chp9/README.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# 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 kernel’s 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, O’Reilly Media.
|
||||
- `man malloc`, `man mmap`, `man mprotect`, `man mlock`
|
||||
Reference in New Issue
Block a user