Вопрос о виртуальной памяти процесса
Никак не могу найти ответ на вопрос, может подскажите...
При создании процесса ядро создает виртуальное адресное пространство в 4 Гб (для 32-х разрядных x86). Эта виртуальная память разделена, по большому счету, на 2 области - User Space и Kernel Space. Так вот меня интересует, из каких соображений сделано разделение только 2:2 и 3:1? Почему нет 3.5:0.5, например? Хочу понять принципы, но нигде ничего подробно не написано на эту тему...
Буду благодарен за подробное объяснение или за ссылки.
2)всё зависит от разработчика оси (все вопросы к Биллу :) )
а вообще если применяется разделение 2/2, то можно легко узнать по самому старшему биту к какой памяти относится адрес: если 1 то системное адресное пространство.
а если разделение 3/1, то если первых 2 старших бита еденицы то системное пространство.
Цитата: koderAlex
1)кол-во виртуальной памяти на нить можно сделать 4*6=24 гига .
2)всё зависит от разработчика оси (все вопросы к Биллу :) )
2)всё зависит от разработчика оси (все вопросы к Биллу :) )
А откуда такие цифры? (4*6) Что 6 означает?
6 это потому код данные стек и на каждый сегмент 2 гига, но на практике ЛИЧНО мне КАЖЕТСЯ врядли т.е. бред.......
только как 24 гига адресовать 32-битными указателями?..
Кто сказал, что 32-битными? Есть вид страничной адресации с 36-битной адресацией. Кроме того давно уже есть 64-битные процы.
Так вопрос был про 32-разрядные системы...
36-и разрядная адресация и применяется на 32-х разрядных системах. PAE называется.
Цитата: NWhisper
Эта виртуальная память разделена, по большому счету, на 2 области - User Space и Kernel Space. Так вот меня интересует, из каких соображений сделано разделение только 2:2 и 3:1? Почему нет 3.5:0.5, например? Хочу понять принципы, но нигде ничего подробно не написано на эту тему...
Вопрос скорей по системному программированию
Рихтер об это пишет, ссылки на форуме есть, Д.Рихтер, "Создание эффективных win32-приложений". Вот отрывок, отвечающий на твой вопрос, например:
Цитата:
Многие разработчики уже давно сетовали на нехватку адресного пространства для пользовательского режима. Microsoft пошла навстречу и предусмотрела в версиях Windows 2000 Advanced Server и Windows 2000 Data Center для процессоров x86 возможность увеличения этого пространства до 3 Гб. Чтобы все процессы использовали раздел для кода и данных пользовательского режима размером 3 Гб, а раздел для кода и данных режима ядра — объемом 1 Гб, Вы должны добавить ключ /3GB к нужной записи в системном файле Boot.ini. Как выглядит адресное пространство процесса в этом случае, показано в графе "32-разрядная Windows 2000 (на x86 с ключом /3GB)" таблицы 13-1.
Раньше, когда такого ключа не было, программа не видела адресов памяти по указателю с установленным старшим битом. Некоторые изобретательные разработчики самостоятельно использовали этот бит как фляг, который имел смысл только в их приложениях. При обращении программы пo адресам за пределами 2 Гб предварительно выполнялся специальный код, который сбрасывал старший бит указателя. Но, как Вы понимаете, когда приложение на свой страх и риск создает себе трехгигабайтовую среду пользовательского режима, оно может с треском рухнуть.
Microsoft пришлось придумать решение, которое позволило бы подобным приложениям работать в трехгигабайтовой среде. Теперь система в момент запуска приложения проверяет, не скомпоновано ли оно с ключом /LARGEADDRESSAWARE. Если да, приложение как бы заявляет, что обязуется корректно обращаться с этими адресами памяти и действительно готово к использованию трехгигабайтового адресного пространства пользовательского режима. А если пет, операционная система резервирует область памяти размером 1 Гб в диапазоне адресов от 0x80000000 до 0xBFFFFFFF. Это предотвращает выделение памяти по адресам с установленным старшим битом.
Заметьте, что ядро и так с трудом умещается в двухгигабайтовом разделе. Но при использовании ключа /3GB ядру остается вceго 1 Гб. Тем самым уменьшается количество потоков, стеков и других ресурсов, которые система могла бы предоставить приложению. Кроме того, система в этом случае способна задействовать максимум 16 Гб оперативной памяти против 64 Гб в нормальных условиях — из-за нехватки виртуального адресного пространства для кода и данных режима ядра, необходимого для управления дополнительной оперативной памятью.
Раньше, когда такого ключа не было, программа не видела адресов памяти по указателю с установленным старшим битом. Некоторые изобретательные разработчики самостоятельно использовали этот бит как фляг, который имел смысл только в их приложениях. При обращении программы пo адресам за пределами 2 Гб предварительно выполнялся специальный код, который сбрасывал старший бит указателя. Но, как Вы понимаете, когда приложение на свой страх и риск создает себе трехгигабайтовую среду пользовательского режима, оно может с треском рухнуть.
Microsoft пришлось придумать решение, которое позволило бы подобным приложениям работать в трехгигабайтовой среде. Теперь система в момент запуска приложения проверяет, не скомпоновано ли оно с ключом /LARGEADDRESSAWARE. Если да, приложение как бы заявляет, что обязуется корректно обращаться с этими адресами памяти и действительно готово к использованию трехгигабайтового адресного пространства пользовательского режима. А если пет, операционная система резервирует область памяти размером 1 Гб в диапазоне адресов от 0x80000000 до 0xBFFFFFFF. Это предотвращает выделение памяти по адресам с установленным старшим битом.
Заметьте, что ядро и так с трудом умещается в двухгигабайтовом разделе. Но при использовании ключа /3GB ядру остается вceго 1 Гб. Тем самым уменьшается количество потоков, стеков и других ресурсов, которые система могла бы предоставить приложению. Кроме того, система в этом случае способна задействовать максимум 16 Гб оперативной памяти против 64 Гб в нормальных условиях — из-за нехватки виртуального адресного пространства для кода и данных режима ядра, необходимого для управления дополнительной оперативной памятью.