Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос о виртуальной памяти процесса

21K
11 марта 2007 года
NWhisper
7 / / 10.01.2007
Всем привет!

Никак не могу найти ответ на вопрос, может подскажите...
При создании процесса ядро создает виртуальное адресное пространство в 4 Гб (для 32-х разрядных x86). Эта виртуальная память разделена, по большому счету, на 2 области - User Space и Kernel Space. Так вот меня интересует, из каких соображений сделано разделение только 2:2 и 3:1? Почему нет 3.5:0.5, например? Хочу понять принципы, но нигде ничего подробно не написано на эту тему...

Буду благодарен за подробное объяснение или за ссылки.
252
12 марта 2007 года
koderAlex
1.4K / / 07.09.2005
1)кол-во виртуальной памяти на нить можно сделать 4*6=24 гига .
2)всё зависит от разработчика оси (все вопросы к Биллу :) )
261
12 марта 2007 года
ahilles
1.5K / / 03.11.2005
просто так проще!!!
а вообще если применяется разделение 2/2, то можно легко узнать по самому старшему биту к какой памяти относится адрес: если 1 то системное адресное пространство.
а если разделение 3/1, то если первых 2 старших бита еденицы то системное пространство.
2.0K
16 марта 2007 года
headsoft
100 / / 15.08.2005
Цитата: koderAlex
1)кол-во виртуальной памяти на нить можно сделать 4*6=24 гига .
2)всё зависит от разработчика оси (все вопросы к Биллу :) )



А откуда такие цифры? (4*6) Что 6 означает?

261
16 марта 2007 года
ahilles
1.5K / / 03.11.2005
6 это потому код данные стек и на каждый сегмент 2 гига, но на практике ЛИЧНО мне КАЖЕТСЯ врядли т.е. бред.......
2.0K
16 марта 2007 года
headsoft
100 / / 15.08.2005
только как 24 гига адресовать 32-битными указателями?..
1.9K
17 марта 2007 года
disasm
232 / / 06.02.2006
Кто сказал, что 32-битными? Есть вид страничной адресации с 36-битной адресацией. Кроме того давно уже есть 64-битные процы.
2.0K
17 марта 2007 года
headsoft
100 / / 15.08.2005
Так вопрос был про 32-разрядные системы...
2
17 марта 2007 года
squirL
5.6K / / 13.08.2003
36-и разрядная адресация и применяется на 32-х разрядных системах. PAE называется.
63
17 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: 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 Гб в нормальных условиях — из-за нехватки виртуального адресного пространства для кода и данных режима ядра, необходимого для управления дополнительной оперативной памятью.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог