= Virtual address spaces per architecture = Below are the various situations as dictated by hardware of each supported architecture and as currently used by HelenOS. The address space split is described from the kernel's point of view. ---- == amd64 == 48-bit virtual address width ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `FFFF800000000000` || 128 TiB || none || kernel identity^[#amd64f2 (2)]^ || || `0000800000000000` || 16776960 TiB || VA hole^[#amd64f1 (1)]^ || || || `0000000000000000` || 128 TiB || none || uspace non-identity || 1. [=#amd64f1] depends on implementation, but in practice current implementations use 48 bits 2. [=#amd64f2] physical addresses beyond the limit of physical memory are mapped non-identity ---- == arm32 == ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `80000000` || 2 GiB || none || kernel identity^[#arm32f1 (1)]^ || || `00000000` || 2 GiB || none || uspace non-identity || 1. [=#arm32f1] physical addresses beyond the limit of physical memory are mapped non-identity ---- == ia32 == ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `80000000` || 2 GiB || none || kernel identity^[#ia32f1 (1)]^ || || `00000000` || 2 GiB || none || uspace non-identity || 1. [=#ia32f1] physical addresses beyond the limit of physical memory are mapped non-identity ---- == ia64 == TBD ---- == mips32 == ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `E0000000` || 512 MiB || kseg3, kernel || unused || || `C0000000` || 512 MiB || ksseg, kernel || unused || || `A0000000` || 512 MiB || kseg1, kernel uncached^[#mips32f1 (1)]^ || `hw_map()` || || `80000000` || 512 MiB || kseg0, kernel identity^[#mips32f2 (2)]^ || kernel identity || || `00000000` || 2 GiB || kuseg, uspace || uspace non-identity || 1. [=#mips32f1] maps to physical 0, uncached, bypasses TLB 2. [=#mips32f2] maps to physical 0, cacheable, bypasses TLB ---- == ppc32 == ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `80000000` || 2 GiB || none || kernel identity^[#ppc32f1 (1)]^ || || `00000000` || 2 GiB || none || uspace non-identity || 1. [=#ppc32f1] physical addresses beyond the limit of physical memory are mapped non-identity ---- == sparc64 == === UltraSPARC I, II, IIi === 44-bit virtual address width ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `FFFFF80000000000` || 8 TiB || kernel^[#sparc64f1 (1)]^ || kernel identity^[#sparc64f3 (3)]^ || || `0000080000000000` || 16777200 TiB || VA hole^[#sparc64f2 (2)]^ || || || `0000000000000000` || 8 TiB || kernel^[#sparc64f1 (1)]^ || kernel identity^[#sparc64f3 (3)]^ || === UltraSPARC III, IIIi, IV and IV+ === 64-bit virtual address width ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `0000000000000000` || 16 EiB || kernel^[#sparc64f1 (1)]^ || kernel identity^[#sparc64f3 (3)]^ || === UltraSPARC T1, T2 === 48-bit virtual address width ||= '''Starting address''' =||= '''Size''' =||= '''HW limitation''' =||= '''HelenOS use''' =|| || `FFFF800000000000` || 128 TiB || kernel^[#sparc64f1 (1)]^ || kernel identity^[#sparc64f3 (3)]^ || || `0000800000000000` || 16776960 TiB || VA hole^[#sparc64f4 (4)], [#sparc64f5 (5)]^ || || || `0000000000000000` || 128 TiB || kernel^[#sparc64f1 (1)]^ || kernel identity^[#sparc64f3 (3)]^ || 1. [=#sparc64f1] both kernel and uspace run in separated 64-bit address spaces 2. [=#sparc64f2] no code within 4GiB reach of the VA hole on UltraSPARC I and II 3. [=#sparc64f3] physical addresses beyond the limit of physical memory are identity mapped, uncachable 4. [=#sparc64f4] no code within 4GiB reach of the VA hole on T1 5. [=#sparc64f5] no code within 8KiB below VA hole on T2