Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
zim32
1 / 1 / 0
Регистрация: 09.01.2011
Сообщений: 37
#1

Объём памяти доступный процессу - C++

10.01.2011, 19:50. Просмотров 1203. Ответов 5
Метки нет (Все метки)

В книге Джеффри Рихтера сказано

"Каждому процессу выделяется собственное виртуальное адресное пространство. Для 32-разрядных процессов его размер составляет 4 Гб. Соответственно 32-битный указатель может быть любым числом от 0x00000000 до 0xFFFFFFFF Всего, таким образом, указатель может принимать 4 294 967 296 значений, что как раз и перекрывает четырехгигабайтовый диапазон"

Ниже написано

Что из 4Гб процессу доступно только 2Гб. Остальные 2Гб - это "Раздел для кода и данных режима ядра"

Так же про "Раздел для кода и данных режима ядра" написано:

"Все, что находится здесь, доступно любому процессу. В Windows 2000 эти компоненты полностью защищены Поток, который попытается обратиться по одному из адресов памяти в этом разделе, вызовет нарушение доступа, а это приведет к тому, что система в конечном счете просто закроет его приложение"

У меня есть 3 вопроса
1) Означает ли что процессу может быть выделено максимально только 2Гб?
2) Как понять странную фразу "Все, что находится здесь, доступно любому процессу" и "Поток, который попытается обратиться по одному из адресов памяти в этом разделе, вызовет нарушение доступа"
3) Что будет если программа обратится по адрессу который находится выше 2Гб?

Заренне всем огромное спасибо за ответы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2011, 19:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Объём памяти доступный процессу (C++):

Как узнать объём выделеной динамичесой памяти? - C++
sizeof(new_alloc) в этом случаи бесполезно так как указатель у меня всегда равен 4 байта. Можно, конечно при помощи цикла передвигать...

Методы доступный только конкретному классу - C++
Можно сделать так чтобы некоторые методы класса В были доступны только в пространстве методах класса А?

Требуется создать объект, доступный из нескольких файлов - C++
Такая вот проблема. Решил сделать глобальный хедер и занести в него объявление переменной-объекта: Global.h #ifndef GLOBAL_H ...

CreateProcess передача параметров процессу - C++
#include "windows.h" #include "iostream" #include <conio.h> using namespace std; void main() { STARTUPINFO cif; ...

Подключение в процессу программы, игры - C++
Подскажите. Я написал программу которая программно нажимает нужные мне клавиши (для игры ) так вот- в браузере (на робочом столе в...

Как передать указатель другому процессу!? - C++
ПОдскажите как можно передать HANDLE другому процессу? Т.е. если создавать процесс через ...

5
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.01.2011, 20:38 #2
Цитата Сообщение от zim32 Посмотреть сообщение
1) Означает ли что процессу может быть выделено максимально только 2Гб?
не помню точно, но в том же рихтере сказано, что есть режим работы, когда ядро адресуется одним Гб ОЗУ, те процессу максимум доступно 3Гб получается
естественно для 64 разрядных системы такого ограничения нет

Цитата Сообщение от zim32 Посмотреть сообщение
2) Как понять странную фразу "Все, что находится здесь, доступно любому процессу" и "Поток, который попытается обратиться по одному из адресов памяти в этом разделе, вызовет нарушение доступа"
процесс не может получить доступ к данным ядра, если он обратится по адресу страницы ядра, то получит ошибку страницы, те не сможет считать или изменить данные
для драйверов это например не так - в режиме ядра они могут обращаться по всем адресам

Цитата Сообщение от zim32 Посмотреть сообщение
3) Что будет если программа обратится по адрессу который находится выше 2Гб?
нарушение доступа, хотя почему бы самому не попробовать?
0
zim32
1 / 1 / 0
Регистрация: 09.01.2011
Сообщений: 37
10.01.2011, 20:59  [ТС] #3
нарушение доступа, хотя почему бы самому не попробовать?

А как можно присвоить произвольное значение указателю?

void* p;
как заставить указатель ссылаться на любой произвольный адресс?
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.01.2011, 21:06 #4
void* p = reinterpret_cast<void*>(0x12345);
0
deadlock
376 / 355 / 8
Регистрация: 14.12.2010
Сообщений: 1,265
10.01.2011, 21:16 #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
процесс не может получить доступ к данным ядра, если он обратится по адресу страницы ядра, то получит ошибку страницы, те не сможет считать или изменить данные
для драйверов это например не так - в режиме ядра они могут обращаться по всем адресам
не вижу связи рассматриваемой адресации и того, что модули ядра выполняются в нулевом кольце защиты процессора, а всё остальное - в третьем - по причине чего пользовательская программа ограничена в своих возможностях.
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.01.2011, 23:41 #6
Цитата Сообщение от deadlock Посмотреть сообщение
не вижу связи рассматриваемой адресации и того, что модули ядра выполняются в нулевом кольце защиты процессора, а всё остальное - в третьем - по причине чего пользовательская программа ограничена в своих возможностях.
в-принципе я чтото примерно это и имел в виду
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2011, 23:41
Привет! Вот еще темы с ответами:

Как операционная система выделяет виртуальную память процессу? - C++
Добрый вечер, хотел уточнить насчёт адресации: создаётся экземпляр win32 программы, выделяет процесс и 1 поток - ОС даёт процессу...

Нужно выделить всю доступную процессу память блоками по 13 байт - C++
Нужно выделить всю доступную процессу память блоками по 13 байт. Использовать нужно две функции : malloc HeapAlloc При этом нужно...

Объём кактуса - C++
Необходимо добавить в класс кактус метод вычисления объёма (предполагая, что кактус - имеет форму цилиндра, то есть \pi*R^2*h) ...

Найти объём куба - C++
Найти объём куба V = r3. Значения вводить и выводить с помощью объектов std::cin и std::cout.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru