I have written two kernels, one a rewrite of the other. In the first I used the recursive page directory method, in the second (currently in development) I use a different method.
Mr. Robinson seems to be saying that mapping the pgdir into itself obviates the need for that linear mapping, which (to me) implies that getting to page tables/directories is the only time the kernel would need to address a physical location in RAM. This seems too good to be true.
The only time that I can see you wanting to access physical RAM is (a) When copying a page across virtual address spaces (for example using copy-on-write, and one process does a write), and (b) when using DMA.
However, accessing physical RAM directly (when it is not mapped into the current virtual address space) is costly: it normally involves disabling paging and interrupts and doing a manual copy, then reenabling them again. It involves wasted CPU time, delayed interrupts and a flushed TLB, so should be avoided at all costs. That is why page tables and entries are mapped into each virtual address space.
The page directory -> itself method DOES work. Definately. However it does have it's drawbacks. Firstly you lose one pgdir entry, which is of course 256MB of address space. Secondly the bit twiddling involved in accessing it is a little complex and easy to get horribly horribly wrong.
I use a different method. My kernel heap is mapped in across all address spaces at 0xc0000000. My kernel heap allocator can be made to give me a chunk of virtual memory on a page boundary, and also return the physical address of the chunk allocated.
To make a page directory or table, I tell it to allocate on a page boundary and give me the physical address. My page directory has an array of pointers to page tables (virtual addresses) and also an array of the physical locations of those page tables (also page aligned). When changing address spaces, I set CR3 to the address of the array of physical locations of page tables (wow, that was a mouthful). So now I can access any page table or page table entry from any address space with the minor implication that each directory uses 4096 bytes more memory. That's something I'm able to live with!
I hope those explanations helped a little bit...