= Virtual to Physical Address Translation = The [source:soft/giet_vm/giet_common/vmem.c vmem.c] and [source:soft/giet_vm/giet_common/vmem.h vmem.h] files define the data structures and functions used by the boot-loader and the kernel to implement the paged virtual memory. [[PageOutline]] The page table initialisation is statically done by the boot-loader. There is one page table for each vspace defined in the mapping. When the architecture is clusterised (X_WIDTH > 1 or Y_WIDTH > 1), for each vspace, the page table is replicated in each cluster. The virtual address format is 32 bits: structured in 3 fields: || 11 || 9 || 12 || || IX1 || IX2 || OFFSET || * The IX1 field is the index in the first level page table * The IX2 field is the index in the second level page table. * The |IX1|IX2| concatenation defines the VPN (Virtual Page Number). Two page sizes are supported: * BPP : Big Physical Page / 2 Mbytes * SPP : Small Physical pages / 4 Kbytes === unsigned long long _v2p_translate( unsigned int vaddr , unsigned int* flags ) === This function returns the physical address from the virtual address. The MMU is supposed to be activated, and it uses the page table defined by the CP0_PTPR register. It supports both small (4 Kbytes) & big (2 Mbytes) pages. * '''vaddr''': virtual address. * '''flags''': page flags are returned in this variable. Exit if PTE1 or PTE2 unmapped.