Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2016, 01:49   #1
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию Закрытый раздел размером 64Кб

Всем здравствуйте!
В книге Джеффри Рихтера в главе 13 на странице 310 в заголовке "Закрытый раздел размером 64Кб" описываются причины появления данного раздела (сам отрывок из книги):
Цитата:
Закрытый раздел размером 64 Кб (только Windows 2000)
Этот раздел заблокирован, и любая попытка обращения к нему приводит к нарушению доступа. Microsoft резервирует этот раздел специально, чтобы упростить внутреннюю реализацию операционной системы. Вспомните: когда Вы передаете Windows-функции адрес блока памяти и его размер, то она (функция), прежде чем приступить к работе, проверяет, действителен ли данный блок. Допустим, Вы написали
код:
Код:
BYTE bBuf[70000];
DWORD dwNumBytesWritten;
WriteProcessMemory(GetCurrentProcess(), (PVOID) 0x7FFEEE90, bBuf, sizeof(bBuf), &dwNumBytesWritten);
В случае функций типа WriteProcessMemory область памяти, в которую предполагается запись, проверяется кодом, работающим в режиме ядра, — только он имеет право обращаться к памяти, выделяемой под код и данные режима ядра (в 32-разрядных системах — по адресам выше 0x80000000). Если по этому адресу есть память, вызов WriteProcessMemory, показанный выше, благополучно запишет данные в ту область памяти, которая, по идее, доступна только коду, работающему в режиме ядра. Чтобы предотвратить это и в то же время ускорить проверку таких областей памяти, Microsoft предпочла заблокировать данный раздел, и поэтому любая попытка чтения или записи в нем всегда вызывает нарушение доступа
Совершенно не понимаю, зачем нужен этот раздел? Неужели в реализации WriteProcessMemory нельзя сделать проверку на условие попадания в адреса равным 0x80000000 или выше?
Вот что сбивает с логического хода мыслей - если реализована проверка на попадание в этот раздел, то что мешало сделать ее на попадание в ядро? Тогда и от раздела отказались бы, а в распоряжении появились бы дополнительные 64Кб.
Базиля вне форума Ответить с цитированием
Старый 26.01.2016, 08:15   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Сделать можно, только будет медленней. Так зачем терять производительность ради перестраховки, что кто-то будет писать куда не надо, если это можно сделать железом?
waleri вне форума Ответить с цитированием
Старый 26.01.2016, 13:56   #3
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

waleri
Цитата:
если это можно сделать железом?
Что вы имеете здесь в виду? Установка доступа "только для чтения" к страницам из данного пространства?
Но в таком случае, необходимо выполнение обработчика по особому случаю нарушения общей защиты, а это разве будет быстрее простой проверки на попадание в область ядра?
Базиля вне форума Ответить с цитированием
Старый 26.01.2016, 15:59   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Обработчик работает только когда кто-то лезет куда не надо, а проверку надо или не надо вызывать обработчик делает железо.
waleri вне форума Ответить с цитированием
Старый 26.01.2016, 16:21   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
В книге Джеффри Рихтера в главе 13 на странице 310 в заголовке "Закрытый раздел размером 64Кб" описываются причины появления данного раздела (сам отрывок из книги)
Я подозреваю, что вы читаете негодный перевод. В подсистеме управления памятью нет русского термина "раздел", разделы только на дисках. Советую найти оригинал и прочитать хотя бы этот абзац на языке первоисточника.
Vapaamies вне форума Ответить с цитированием
Старый 26.01.2016, 17:00   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

"region" там скорее всего.
Мне непонятно про 64К. При сегментированной модели в DOS это имело смысл, при flat памяти - никакого.
Тем более, что память, где ядро, защищена вся.
Второй вариант, что речь идет о *первых* 64К. Например ресурсы могут быть либо числом, либо строчкой и для того, чтоб отличить одних от других *все* указатели в Windows всегда > ^64К.

Последний раз редактировалось waleri; 26.01.2016 в 17:06.
waleri вне форума Ответить с цитированием
Старый 26.01.2016, 17:44   #7
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Обработчик работает только когда кто-то лезет куда не надо, а проверку надо или не надо вызывать обработчик делает железо.
Безусловно. Но я имел в виду, что сам код обработчика нужно исполнять. Если вы попытаетесь записать в страницу с атрибутом защиты "только для чтения" то это вызовет нарушение общей защиты, я прав?
Отсюда, по нашему рассуждению, разработчики попросту решили этот регион в 64Кб сделать "только для чтения", возложив пресечение попыток добраться до области ядра через этот регион на сам обработчик.

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Я подозреваю, что вы читаете негодный перевод. В подсистеме управления памятью нет русского термина "раздел", разделы только на дисках. Советую найти оригинал и прочитать хотя бы этот абзац на языке первоисточника.
Прочитал только что в оригинале:
Цитата:
64-KB Off-Limits Partition (Windows 2000 Only)
This 64-KB partition just above the user-mode partition is off-limits, and any attempt to access memory in this partition causes an access violation. Microsoft reserves this partition because doing so makes implementing the operating system easier for Microsoft. When you pass the address of a block of memory and its length to a Windows function, the function validates the memory block before performing its operation. You could easily imagine code like this (running on a 32-bit Windows 2000 system):
Код:
BYTE  bBuf[70000];
DWORD dwNumBytesWritten;
WriteProcessMemory(GetCurrentProcess(), (PVOID) 0x7FFEEE90, bBuf, sizeof(bBuf), &dwNumBytesWritten);
For a function like WriteProcessMemory, the memory region being written to is validated by kernel-mode code, which can successfully access memory in the kernel-mode partition (addresses above 0x80000000 on a 32-bit system). If there is memory at the 0x80000000 address, the above call will succeed in writing data to memory that should be accessible only by kernel-mode code. To prevent this while making the validation of such memory regions fast, Microsoft chose to keep this partition always off-limits; any attempt to read from or write to memory in this region will always cause an access violation.
Противоречий между оригиналом и переводом, честно говоря, не обнаружил.
Но вот что касается терминологии. Что не так с термином "раздел"? Олиферы, к примеру, в своей книге по сетевым операционным системам, дают ему определение и используют при описании алгоритмов распределения памяти.

Цитата:
Сообщение от waleri Посмотреть сообщение
Второй вариант, что речь идет о *первых* 64К. Например ресурсы могут быть либо числом, либо строчкой и для того, чтоб отличить одних от других *все* указатели в Windows всегда > ^64К.
Про отлов нулевых указателей автор написал чуть ранее, на этой же странице
Так что это определенно относится к региону с 0x7FFF0000.

Последний раз редактировалось Базиля; 26.01.2016 в 18:11.
Базиля вне форума Ответить с цитированием
Старый 26.01.2016, 20:41   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Код обработчика будет выполняться только когда возникнет обращение по запрещенному адресу, во всех остальных случаях никаких обращений к нему нет. Таким образом, быстродействие этого кода не имеет особого значения.

Доступ ограничивает железо а обработчик только уведомляет вас об этом.
waleri вне форума Ответить с цитированием
Старый 26.01.2016, 22:07   #9
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

waleri
Мне кажется мы друг друга не понимаем.
Я же нигде не писал, что обработчик вызывает сама ОС
Попытка записи в сегмент (в нашем случае страницу) доступный только для чтения (то о чем я и говорю) вызывает особый случай нарушения общей защиты. В общем случае, если человек попытается писать в этот раздел, у него ничего не выйдет, так как на него назначен атрибут "только для чтения". Иначе доступ никак не запретить.
Базиля вне форума Ответить с цитированием
Старый 26.01.2016, 22:31   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Я думаю суть сводится к тому, что при такой реализации надо проверять только начальный адрес. При попытке "переполнения" натыкаемся на регион защиты и сваливаемся.

Смысла я все же не понимаю, все равно у процесса доступа к памяти ядра нет.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перезаписать один файл размером 5 Гб в другой размером 5Гб Ланулечка Помощь студентам 0 28.05.2013 12:59
Задана матрица размером n x m и вектор размером m Alexan88 Общие вопросы C/C++ 3 20.12.2010 16:01
Как залесть на закрытый форум? Монгол Свободное общение 12 15.08.2009 19:07
Как наложить иконку с исходным размером 16х16 на битмап с размером 32х32? SkAndrew Мультимедиа в Delphi 1 26.04.2008 14:44