I'm currently using recursive page tables for the OS I'm working on, but I'm probably going to change that. There are lots of different address spaces for different processes and (with IOMMU) devices, and it's nicer to be able to modify any of them rather than only the current one. I am leaning toward just assigning 2 MiB of memory to page tables at a time and keeping a mapping for these (I don't want to map all physical memory in the kernel for security reasons).