Во-первых, вы должны начать с определения «управляемый» и «нативный». В «управляемой» ОС, такой как Midori, ядро все еще ngen-ed (предварительно скомпилировано в машинный код), а не jit-компилируется из IL. Так что я бы исключил это как различие между «управляемым» и «нативным».
Есть два других различия между «управляемым» и «нативным» кодом, которые приходят мне на ум - способность к защите кода и управление ресурсами.
Большая часть "нативного" кода не поддается проверке, поэтому "управляемый" загрузчик ОС может отказаться даже загружать "нативные" образы. Конечно, можно создавать проверяемый «нативный» код, но это накладывает множество ограничений и по сути ничем не отличается от «управляемого» кода.
Ресурсы в «управляемой» ОС будут управляться ОС, а не приложением. «Нативный» код обычно выделяет и очищает свой ресурс. Что произойдет с ресурсом, который был выделен API-интерфейсом ОС и передан «родному» коду? Или наоборот? Должны быть достаточно четкие правила относительно того, кто и когда будет заниматься управлением и очисткой ресурсов. По соображениям безопасности я не могу представить, чтобы ОС давала непосредственный контроль над «родным» кодом каким-либо ресурсам, кроме виртуальной памяти процесса. Следовательно, единственная причина, по которой стоит переходить на «родной» режим, - это реализовать собственное управление памятью.
Сегодняшний код natve не воспроизводится по любому из приведенных выше правил. Таким образом, «управляемая» ОС должна отказаться от ее непосредственного выполнения. Однако «управляемая» ОС может обеспечивать уровень виртуализации, такой как Hyper-V, и размещать «родной» код на виртуальной машине.