I looked up the memory map and memory mapping sections of the MEMC datasheet, and one thing that I had either forgotten or never paid any attention to was the possibility of 4K pages with MEMC. I started out with a 1MB A3000 which used 8K pages, but I imagine that A305 users would have been aware of 4K pages with the right software (like the RISC OS Task Manager, if anyone managed to use RISC OS on a 512K system) making it apparent.
Of course, the page size is proportional to the total amount of physical memory accessible to each MEMC, this being 4M (imposed by the 20-bit RAM addressing), dividing the memory into 128 pages. And since the maximum amount of addressable physical memory is 16M, this seems to introduce the limit of four coupled MEMCs to access that amount of memory.
I did wonder whether it might have been possible to have some kind of base page for the page table in such a way that instead of the 128-entry page table covering the entirety of physical memory, there would have been a window into a region of physical memory employing a smaller page size. So, a task or process might have been able to occupy up to, say, 512K using 128 pages of 4K, this being constrained to a particular 512K area of the total memory. This might have been inflexible and introduce all sorts of page allocation issues, but it might have offered a workaround for the underlying issues of the MEMC architecture.
The VLSI Technology datasheet for the ARM chipset notes the following:
At this point, I wanted to look at some source code for a multitasking operating system to see what implementers actually do with MEMC. Although RISC iX sources may be out there, I remembered that NetBSD had an acorn26 port that worked on the A-series and R-series machines. In NetBSD 7.2, the usr/src/sys/arch/acorn26/acorn26/pmap.c file has a useful remark:MEMC provides a descriptor entry for every page of physical memory which eliminates descriptor thrashing (address translation misses) from degrading system performance.
Previously, we wondered what advantages the MEMC approach might have for implementers over a simpler approach involving a TLB and a page fault handler (familiar from MIPS, Am29000, and so on). Ignoring remarks about "UNIX hackers... learning to love it", it seems like we have some kind of answer.The page tables in the MEMC are implemented using content-addressable memory, with one cell for each physical page. This means that it's impossible to have one physical page mapped in two locations. For this reason, we try to treat the MEMC as a TLB, and to keep enough information around to quickly re-load mappings without troubling uvm_fault().