Don’t use recursive page tables.
- What if you want to port to an architecture that can’t do them?
- How sure are you that all the bonus bits in the entries line up right?
- What if you want to use huge pages of various sizes?
- What if you want to write-protect some page tables?
- What if you want to access a non-current page table? If you do that you need to write all the relevant logic anyway.
- What if a page table isn’t allocated? You probably don’t want to find out by trying to access it and getting a page fault in kernel mode.
- What if you don’t want user code to be able to trivially guess kernel addresses?