Адреса. Где чё?
--------------------------------
Да, кстати, а где кончается видеопамять?
000000h-0003FFh- векторы прерываний.
000400h-0004FFh- облость переменных биоса.
0A0000h-0AFFFFh -Видео память под графические цветные режимы.
0B0000h-0B7FFFh -Видео память под монохромные символьные режимы
0B8000h-0BFFFFh -Видео память под цветные символьные режимы.
0C0000h-0DFFFFh -Биосы различных устройств
Чуть подробне
0C0000h–0C7FFFh -Биос видео карты 32Кб или 64Кб
0С8000h-различные- Биос жедсткого диска.
0E0000h-0FFFFFh - ROM BIOS
0C0000000-0FFFFFFFF -облость отводиться под различные устройства восновном PCI, видео карта это тоже PCI устройство. И др современные устройства.
А вобще в системе нет фиксированных диапазонов.
Pavia, сейчас практически все BIOS используют под свои нужды небольшой участок памяти под границей 0A0000h (это называется дополнительной областью данных BIOS - extended BIOS data area)...
DOS Application Area (00000h–9FFFh)
The DOS area is 640 KB in size, and it is further divided into two parts. The 512-KB area at 0 to
7FFFFh is always mapped to the system memory controlled by the MCH, while the 128-KB
address range from 080000 to 09FFFFh can be mapped to PCI_A or to system memory. By default
this range is mapped to system memory and can be declared as a system memory hole (accesses
forwarded to PCI_A) via MCH FDHC configuration register.
Каким способом можно определить объём ФИЗИЧЕСКОЙ памяти.
int 15h
; на выходе - в AX количество расширенной памяти в килобайтах
А тебе в защищенном нада?
http://subscribe.ru/archive/comp.soft.prog.asmos/200202/15170824.html
или так просто проверив возможноли считать данные из указанного диапазона:
http://www.wasm.ru/article.php?article=hardzen
А также можно воспользоваться DMI.
Также можно считать SPD блоки.
Или же пообщаться с контролером памяти, правдо тут я не уверен.
Pavia, сейчас практически все BIOS используют под свои нужды небольшой участок памяти под границей 0A0000h (это называется дополнительной областью данных BIOS - extended BIOS data area)...[/QUOTE]
Может тогда дашь ссылочку на литературку про ACPI, был бы очень признателен! Кстати ты какую модель памяти выбрал в своей МЕГА-ОСи???
Может условный потому что: если проц работает нормально - то перейти туда-то, а если у него башня дымится то совсем в другое место??? :-)
Посмотри INT19 .Ночальное состояние регистров = 0 ( кроме IP ) .
Режим реальный .
Используемую мной модель памяти лучше всего назвать смешанной, потому что в ней есть и элементы FLAT'а (прикладная часть процесса, локальные данные ядра/драйверов, глобальные данные ядра) и сегментное разделение нескольких адресных пространств (код ядра/драйверов, глобальные данные драйверов). И конечно все эти адресные пространства существуют поверх пейджинга.
- Как узнать (в процессе работы загрузчика) где находится например Биос видео карты? или там всегда стандартный адрес 0C0000h?
- Как узнать предел памяти (всмысле физической)?
- И ещё биос харда находтися по адресу 0С8000h, а где он кончается?
2. По адресу и размеру последнего блока доступной памяти.
3. У каждого BIOS-юнита байт по смещению 2 определяет длину юнита в блоках по 512 байт. Иными словами, длину юнита, находящегося по адресу 0xC8000, можно узнать из ячейки по адресу 0xC8002, правда, сначала не помешало бы проверить предыдущие два байта на наличие сигнатуры 0xAA55. Кстати, я не уверен, что этот юнит обязательно должен относиться к жесткому диску.
2. По адресу и размеру последнего блока доступной памяти.
2.У меня пишет адрес: FFFF0000h, размер 10000h, хотя пямяти у меня 1,25Гб.
3. У каждого BIOS-юнита байт по смещению 2 определяет длину юнита в блоках по 512 байт.... ...сначала не помешало бы проверить предыдущие два байта на наличие сигнатуры 0xAA55. Кстати, я не уверен, что этот юнит обязательно должен относиться к жесткому диску.
Как определить, какой юнит к чему относиться? А что будет обозначать значение 0xAA55 - в 0xC8000?
Где вообще про это можно почитать (желательно на русском)?
Так же можно почитать в "PhoenixBIOS 4.0 Programmer’s Guide"
Только учти что в других биосах функция должна вызываться как
mov eax, 0E820h Просто некоторые проверяют по EAX, а некоторые по AX.
3. Начнем с того что в С8000h может и нележать ничего. А может и видео биос продолжаться.
AA55h это волшебные символы означающие присутствие BIOS.
Более подробно можно прочитать в спецификации PCI.
И еще чучуть в PnP.
Это не ОЗУ! Тип блока проверял?
Читай спецификацию PCI. А зачем тебе это нужно?
Я же тебе написал, что это сигнатура, указывающая на присутствие юнита по данному адресу, хотя может случиться так, что это просто код внутри какого-то юнита, поэтому нужно выполнять анализ от начала диапазона 0xC0000-0xDFFFF. По длине первого юнита определить диапазон поиска второго, учитывая еще и то, что очередной юнит может начинаться только на 2-килобайтовой границе. Найдя второй юнит, искать за ним третий и т.д. Кстати Pavia прав, видео-BIOS часто занимает больше 32 Кб.
Это не ОЗУ! Тип блока проверял?
:confused: результат работы int 15h 0E820h:
[FONT="Courier New"][начало] [размер] [тип] [атр]
000000000000 000000009F800 00000001 {не определился почему то}
00000009F800 0000000000800 00000002 {не определился почему то}
0000000DC000 0000000024000 00000002 {не определился почему то}
000000100000 000000FDF0000 00000001 {не определился почему то}
00000FEF0000 000000000F000 00000003 {не определился почему то}
00000FEFF000 0000000001000 00000004 {не определился почему то}
00000FF00000 0000000100000 00000001 {не определился почему то}
0000FEC00000 0000000010000 00000002 {не определился почему то}
00000FFFE000 0000000020000 00000002 {не определился почему то}[/FONT]
Всмысле "не ОЗУ"? А как посмотреть ОЗУ?
Более подробно можно прочитать в спецификации PCI
А где их можно скачать? Дай ссылочку!
И ещё, я вопрос изначально не совсем правильно поставил, мне нужно знать диапазоны адресов в которые нельзя записывать данные,код,стек,TSS и т.п. (чтоб всё нормально работало), например, 0B8000h-0BFFFFh (видеопамять). какие ещё диапазоны?
Что касается последнего вопроса, то здесь все просто. Нет необходимости действовать методом исключения, т.к. BIOS сама сообщает в том числе и доступные для ОС участки памяти. Изначально для ОС доступны блоки типа 1, а после того, как ты извлечешь всю необходимую инфу из ACPI-таблиц, то и блоки типа 3. Лично я использую только блоки типа 1.
В первый диапазон (00000-9F800) входит кусок памяти 400h-4FFh(облость переменных биоса). Я так понимаю что туда ничего записывать нельзя, а какие ещё есть области памяти входящие в диапазоны типа 1, но в которых нельзя хранить данные/код/стек и т.п.
Phantom-84, не можешь ли прямо случаем дать может быть пару линков на доку по ACPI, а то я тоже ужаснулся прямо таки!
Видимо, имеется модуль в 1 гиг, который по каким-то причинам "не виден". Возможно, он поврежден или не симметричен/не совместим с другим.
На самом деле ОС защищенного режима может использовать в своих целях участок 0-0x4FF, но только после того как BIOS полностью перестает использоваться (нет сервисных запросов; не обрабатываются аппаратные прерывания; нет программ, которые подразумевают наличие определенных данных в этом участке памяти). Лично я не использую этот участок памяти для хранения собственных данных, а изменять его вполне допустимо, но только по определенным правилам. Кроме участка 0-0x4FF больше нет участков, которые принадлежали бы к блокам типа 1 и хоть как-то использовались. Участок EBDA под границей 640 Кб должен корректно отсекаться и в результате вызова сервисной функции int 15h/E820h и в результате вызова сервисной функции int 12h.