90 likes | 269 Views
Linux Memory Management. High-Level versus Low-Level. Assigning memory to tasks. Each Linux process has a ‘process descriptor’ with a pointer inside it named ‘mm’: struct task_struct { pid_t pid; char comm[16]; struct mm_struct *mm;
E N D
Linux Memory Management High-Level versus Low-Level
Assigning memory to tasks • Each Linux process has a ‘process descriptor’ with a pointer inside it named ‘mm’: struct task_struct { pid_t pid; char comm[16]; struct mm_struct *mm; /* plus many additional fields */ };
struct mm_struct • Describes the task’s ‘memory map’ • Where’s the code, the data, the stack? • Where are the ‘shared libraries’? • What are attributes of each memory area? • How many distinct memory areas? • Where is the task’s ‘page directory’?
Virtual Memory Areas • Inside ‘mm_struct’ is a pointer to a list • Name of this pointer is ‘mmap’ struct mm_struct { struct vm_area_struct *mmap; /* plus many other fields */ };
Linked List of VMAs • Each ‘vm_area_struct’ points to another struct vm_area_struct { unsigned long vm_start; unsigned long vm_end; unsigned long vm_flags; struct vm_area_struct *vm_next; /* plus some other fields */ };
Structure relationships The ‘process descriptor’ for a task task_struct Task’s mm structure mm_struct *mm *mmap VMA VMA VMA VMA VMA Linked list of ‘vm_area_struct’ structures
Demo ‘vma.c’ module • Creates a pseudo-file: /proc/vma • Lets user see the list of VMAs for a task • Also shows the ‘pgd’ field in ‘mm_struct’ EXERCISE • Compare our demo to ‘/proc/self/maps’