Думаю надо делать так, как у Алана было сделано в самой первой реализации, до того как он стал пытаться объять необъятное, и как сделано у меня в UZIX - используется диспетчер целых страниц по 64к (порт F9), в одной странице ядро, в остальных - процессы (по странице на процесс). В общей области (F000 и выше) - только UDATA, межстраничный стек и подпрограммы межстраничного вызова. UDATA+стек (всего полторы сотни байт) копируется в пространство процесса ниже F000 при каждом переключении контекста. Это дает более быстрое переключение, и что самое главное - нормальное количество места под процесс. С меньшим местом нечего и затевать, опять все упрется в то что ничего не влезает, особенно если пользовать SDCC.

Диспетчер 16к тоже можно использовать - например сделать libc c оверлеем в области 0000...4000 для тяжелых приложений.