- Privilege levels: Since all the code that is executed on the system is generated by the JIT-Compiler (which is trusted), all the code can be considered trusted, thus executing it at ring0. A system call needs no ring transition any more.
- Memory Management: When you involve a copying garbage collector (that every application uses), additional memory optimization at runtime can be done. Also, this garbage collector could take care of swapping (writing an unused object to disk and reuse its memory), swapping takes place at object level rather than page level, thus the need for an mmu would disappear. It remains to be seen however, whether the mmu could still be used to improve performance (dirty bit to determine how often a memory region is used...).
- Runtime optimization: In traditional natively compiled code, any optimization has to take place at compile time. When code must be compiled seperately for portability or manageability reasons (driver <-> kernel <-> syscall-library <-> app <-> utility-lib), it must be linked seperately. When the native code is generated at load time by the JIT-Compiler, any optimization can be carried out there, the code could be profiled at run-time and recompiled with different settings to achieve the best results. As a side effect, the code will also be architecture independent ;D. Note that optimization also covers inlining of procedures, which is then possible for functions that reside in a different library, or even in the kernel (when there still is a construct like a kernel).
- Usage of privileged instructions: For very short critical sections, the JIT-Compiler could simply disable interrupts to prevent concurrent access to a memory location/device, instead of acquiring a lock.
What do you think about this? I had a more detailed design on my VM-OS somewhere about 2 years ago, it was quite inspired by J2EE at that time. I'll write something more about it when you are interested.
cheers Joe