Virtual Memory in the IA-64 Linux Kernel - 2 | Cerca per titolo, autore, parola chiave | ||||||||
Virtual Memory in the IA-64 Linux Kernel - 2 Di Stephane Eranian e David Mosberger, 2002. Tratto da IA-64 Linux Kernel: Design and Implementation. Lo spazio di indirizzi virtuale di ogni processo Linux è diviso in due aree: lo spazio del kernel e lo spazio utente. Come illustrato dalla parte sinistra della figura 4.4, lo spazio utente (user space) occupa la porzione più bassa dello spazio degli indirizzi,, espandendosi dall'indirizzo 0 fino al valore, specifico della piattaforma, del task size limit (TASK_SIZE). Il restante spazio è occupato dallo spazio del kernel. Molte piattaforme usano un task size limit grande abbastanza per assegnare almeno la metà dello spazio degli indirizzi disponibile allo spazio degli indirizzi utente. Lo spazio utente è assegnato al processo, nel senso che è mappato dalla page table del processo. Lo spazio del kernel, invece, è condiviso tra tutti i processi. Lo spazio del kernel può essere visto in due modi: uno spazio degli indirizzi mappato nella parte alta della page table di ogni processo, oppure uno spazio che occupa la parte alta dello spazio degli indirizzi virtuali della CPU. A seconda della specifica CPU su cui viene eseguito Linux, lo spazio del kernel può essere implementato in uno o nell'altro modo. Durante l'esecuzione a livello utente, il solo spazio utente è accessibile. Tentare di scrivere, leggere o eseguire il kernel space causerebbe un protection violation fault. Questo, ovviamente, per evitare che un processo utente corrompa l'area del kernel. Durante l'esecuzione del kernel, invece, gli spazi accessibili sono sia quello del kernel, sia quello utente. User address space File di riferimento (le cartelle variano a seconda del sistema in uso!): /usr/src/linux-headers-4.15.0-126/include/linux/mm.h /* * Linux kernel virtual memory manager primitives. * The idea being to have a "virtual" mm in the same way * we have a virtual fs - giving a cleaner interface to the * mm details, and allowing different kinds of memory mappings * (from shared memory to executable loading to arbitrary * mmap() functions). */ /usr/src/linux-headers-4.15.0-126/include/linux/sched.h /* * Define 'struct task_struct' and provide the main scheduler * APIs (schedule(), wakeup variants, etc.) */
Ogni spazio degli indirizzi è rappresentato, nel kernel, da un oggetto chiamato: mm_struct Molti processi possono condividere lo stesso spazio degli indirizzi, così: mm_struct è un oggetto reference-counted che esiste fino a quando almeno un processo sta usando lo spazio degli indirizzi rappresentato dalla mm_struct Ciascuna task_struct ha un puntatore alla: mm_struct che definisce lo spazio degli indirizzi della task (per semplicità, assimiliamo una task ad un processo). Questo puntatore è noto come puntatore: mm Un caso speciale sono le task che accedono solo allo spazio del kernel (per esempio kswapd), alle quali viene assegnato un anonymous address space, con il puntatore (mm pointer) impostato a NULL. Quando viene eseguita una task kernel, Linux non cambia lo spazio degli indirizzi (perché non c'è alcuno spazio dgli indirizzi a cui reindirizzare), lasciando attivo quello precedente. Un altro puntatore nella task structure tiene traccia dello spazio degli indirizzi preso a prestito in questo modo. Questo puntatore è noto come puntatore: active_mm Per una task in esecuzione, questo puntatore non è mai NULL. Se la task ha il suo proprio spazio degli indirizzi, l'active mm pointer ha lo stesso valore del puntatore mm; altrimenti, l'active mm pointer punta alla mm struct dello spazio degli indirizzi preso a prestito (tanto il kernel address space è lo stesso per tutte le task). La mm struct contiene puntatori alle due strutture di dati che sono il cuore del virtual memory system: la page table (tabella delle pagine) e la lista delle aree virtuali di memoria (virtual memory areas), che descriveremo tra poco. Inoltre, la mm struct contiene informazioni quali il mm context, un conteggio del numero di pagine virtuali attualmente in uso (resident set size, o RSS), l'indirizzo iniziale e finale dei segmenti text, data, stack, oltre ad altre informazioni utili al demone kswapd.
|
|||||||||
Virtual Memory in the IA-64 Linux Kernel - 2 | Disclaimer: questo è un link a contenuti ospitati su server esterni. |