Написал простейший драйвер, по примеру из книжки Солдатова. Как обращаться к памяти? Например получить дату BIOS. char *bios_date = (char *)0xFFFF5; приводит к синему экрану и перезагрузке. Я в этом деле пока не шарю вообще, так что сильно не бейте
ECk А можно подробнее. В Win9x можно получить дату bios обратившись по адресу 0xFFFF5; Как я понял MmMapIoSpace получает виртуальный адрес из физического. А 0xFFFF5 это какой? виртуальный или физический?
Сделал так: char *bios_date = NULL; MEMORY_CACHING_TYPE cache = 0; PHYSICAL_ADDRESS addr; addr.HighPart = 0; addr.LowPart = 0xFFFF5; bios_date = MmMapIoSpace(addr, 0, cache); Работает ECk, спасибо. Только вот интересует второй параметр MmMapIoSpace NumberOfBytes Specifies the number of bytes to be mapped. Что это значит?
Xerx То есть, например, для даты bios нужно отобразить 8 байт? (08/22/02) А почему MmMapIoSpace(addr, 0, cache); срабртала и BSOD не вызвала ????
GLEB Насколько помню время работы под DOS, да, 8 байт. Почему сработала - вопрос скорее к экспертам, я ни разу не вызывал ее с нулевым размером
n0name Все равно странно, что выравнивание 0 дает страницу. Если выравнивать (a+(SIZE-1)) && SIZE, то все-равно получится ноль. Запомню на будущее, спасибо.
page_count = (addr & (PAGE_SIZE - 1) + size + (PAGE_SIZE - 1)) >> PAGE_SHIFT Это определяется количество страниц для выделения. тк 0xFFFF5 ну никакк не кратно PAGE_SIZE, то и 0 вполне сгодится.
То есть MmMapIoSpace как бы копирует блок памяти размером NumberOfBytes начиная с указанного физ. адреса и возвращает виртуальный адрес (указатель на этот блок), а MmUnmapIoSpace соответственно освобождает его, так? P. S. Может глупость скажу или не в тему, но все же... почему char *bios_date = (char *)0xFFFF5; работает в Win 9x? Винда сама чтоли различает физические и виртуальные адреса? И почему подобное не работает в NT? Или в NT обращение к физ. адресу запрещено даже из режима ядра? P. S. S. Что за функция MmGetVirtualForPhysical (в DDK есть, но не описана почему-то) bios_date = MmGetVirtualForPhysical(addr) привело к синему экрану
можно сказать и так. отмаппировала винда уже. нет разная организации памяти это не ограничение винды. лучше ее не использовать
не совсем. память одна, ничего никуда не копируется. просто в разных моделях памяти один и тот же кусок лежит по разным адресам, грубо говоря. в реальном режиме и в защищенном режиме без страничной трансляции линейный и физический адреса совпадают. в защищенном режиме со страничной трансляцией, в котором работают все современные ОС, виртуальный адрес можно преобразовать в любой физический по желанию разработчика. MmMapIoSpace как раз добавляет такое отображение, а MmUnmapIoSpace снимает его ну все верно.. обращение по невалидному адресу меньше MmHighestUserAddress из ядра приводит к исключению STATUS_ACCESS_VIOLATION, которое у тебя, по-видимому, не обрабатывалось.