Разницы, по сути, никакой. Причина такого размещения в Винде, возможно, историческая: многие вещи, касающиеся ядра Винды, идут из VAX/VMS (главный архитектор Винды, Дэвид Катлер, до того был главным разработчиком ДЕКовских систем). Ну а на ВАХах была архитектурная фишка, из-за которой системный код должен был размещаться в старших двух гигабайтах адресного пространства, а прикладной -- в младших.
Кроме того, возможно, исходили из размещения всего прикладного кода с нулевого виртуального адреса. На практике от этого отказались: младшая страница виртуального адресного пространства для прикладного кода сделана недоступной, чтобы ловить попытки обращения по нулевым указателям (дополнительное средство ловли ошибок в приложениях).
Можно, конечно, размещать и код ядра, и прикладной код с нулевого виртуального адреса. Но тогда возникает неудобство: для того, чтобы добраться до памяти приложения, ядро должно использовать виртуальные адреса, отличающиеся от используемых в самом приложении.
В общем, размещать можно где угодно и как угодно, но для удобства программирования ядра необходимо, чтобы его виртуальные адреса не использовались прикладным кодом. Вполне можно делать так, как у Вас: ядро идёт с нулевых адресов, приложение -- где-то позже (например, с границы 1 Гбайта). Более того, такой подход лично мне кажется более разумным: в любом случае надо блокировать доступ задач к самым младшим адресам памяти (для отлова нулевых указателей, как уже говорил выше), так что для них эти виртуальные адреса по-любому должны быть недоступными, так почему бы там не начать ядро?
А вообще, эффективное управление памятью, если охватывать все его аспекты -- вещь сложная. Сложней только ввод-вывод.
|