Осваиваю bios по книге "BIOS дизассемблирование, модификация, программирование" Дармаван Салихана. Но что-то этот процесс весьма медленный :/ (начал перечитывать книгу в третий раз) Возникает множество вопросов, на которые мне хотелось бы найти ответы от знающих людей. Начнём пожалуй с устройства материнской платы. Вот сделал парочку снимков, и выделил некоторые части. Хотел узнать, правильно ли я выделил Северный и Южный мосты на плате. А также, что на плате является Шиной DMI (связывает между собой Северный и Южный мосты) . Да и что на плате является интерфейсом LPC (связывает Южный мост и чип BIOS). (237 кб) http://s61.radikal.ru/i171/0903/c4/24df33685fe8.jpg (235 кб) http://s58.radikal.ru/i160/0903/b3/8b377853224c.jpg То что я назвал Южным мостом, больше походит на Энергонезависимую память (в которой хранятся настройки BIOS)...и если это именно такая память..то что такое Южный и Северный мосты.... где они расположены? как работают? Теперь перейдём к адресному пространству систем на базе чипсета intel 955x/ich7 Вот изображение из книги http://rapidshare.com/files/212669583/Fig01_06.jpg.wmf.html (435 кб). ( Да простит меня автор. ) Поясните мне пожалуйста, TOLUD - как написано в книге, это верхний предел видимый ОС. Что это значит? :| На рисунке, выше TOM(верхний предел занятой физической памяти) расположены : Диапазон адресов основной памяти (основной памяти? это какой?..ROM ?)..Ещё выше находится Диапазон адресов памяти PCI ...каким образом происходит обращение на это адресное пространство?? (рассматривается архитектура 80/86).. Следующие вопросы добавлю чуть позже. Как только будут ответы на эти.
stellaco Во первых читай книжку внимательнее. вначале надо определить что за материнка? По картинке не ясно То что ты обозначил как южный мост это не верно. Это похоже на Super IO и южный мост объединен в одном чипе. Скорее всего это VIA, а не Intel. Сейчас посмотрим видио скажу что там у тебя есть. К примеру у нас 4ГБ озу. А TOLUD установлен на 3ГБ. От 0 до TOLUD будет память. От TOLUD до 4ГБ под устройства PCI и прочии. Свыше 4ГБ там другой ограничитель. На вики можешь посмотреть может попонятее будет. http://wiki.osdev.ru/index.php?title=%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C
Так и происходит Обыкновенный mov. Адресс выставляется на шине адресса контроллер памяти решает это ОЗУ или нет. Если нет то отпровляет дальше по линиям, если ОЗУ то соответственно заворачивает в нее.
Pavia Большое спасибо за ответ. Следующий вопрос, касается дизассемблирования .bin bios в ida. В книге написано следующие "Откройте 512-килобайтный файл в ida и установите начальный адрес загрузки в в 8_0000h-F_FFFFh. Затем создайте новые сегменты в диапазоне адресов FFF8_0000h - FFFD_FFFFh и переместите содержимое блока 8_0000h-F_FFFFh в только-что созданный сегмент" и дан код Code (Text): // Листинг 5.4. Сценарий IDA Pro для перемещения блока начальной загрузки Award BIOS с целью имитации отображения кода BIOS на системное адресное пространство auto ea, ea_src, ea_dest; /* Создаем сегменты для двоичного файла, загруженного в данный момент. */ for(ea = 0x80000; ea < 0x100000; ea = ea + 0x10000) {SegCreate(ea, ea + 0x10000, ea>>4, 0, 0, 0);} /* Создаем новые сегменты для перемещения */ for(ea = 0xFFF80000; ea < 0xFFFE0000; ea = ea + 0x10000) {SegCreate(ea, ea + 0x10000, ea>>4, 0, 0, 0);} /* Перемещаем сегменты. */ ea_src = 0x80000; for(ea_dest = 0xFFF80000; ea_dest < 0xFFFE0000; ea_dest = ea_dest + 4) {PatchDword(ea_dest, Dword(ea_src)); ea_src = ea_src + 4;} /* Удаляем ненужные сегменты, чтобы имитировать системное пространство адресов. */ for(ea = 0x80000; ea < 0xE0000; ea = ea + 0x10000) {SegDelete(ea, 1);} Возможно это глупый вопрос..но как установить начальный адрес загрузки в в 8_0000h-F_FFFFh в ida ??
n0name Да, именно то..спасибо. Открыв бинарный файл BIOS и проделав некоторые манипуляции (запуск скрипта ida ..который перемещает сегменты).. должно получиться следующее(пример из книги) Code (Text): Листинг 5.5. Дизассемблированный код вспомогательной подпрограммы для конфигурирования PCI Адрес Мнемонический код F000:F770 read_pci_byte proc near F000:F770 mov ax, 8000h F000:F773 shl eax, 10h F000:F777 mov ax, cx F000:F779 and al, 0FCh F000:F77B mov dx, 0CF8h ; dx = порт адреса конфигурационного ; пространства PCI F000:F77E out dx, eax F000:F780 add dl, 4 ; dx = порт данных конфигурационного ; пространства PCI F000:F783 mov al, cl F000:F785 and al, 3 F000:F787 add dl, al F000:F789 in al, dx ; Читаем значения соответствующих регистров. F000:F78A retn F000:F78A read_pci_byte endp F000:F78C write_pci_byte proc near F000:F78C xchg ax, cx F000:F78D shl ecx, 10h F000:F791 xchg ax, cx F000:F792 mov ax, 8000h F000:F795 shl eax, 10h F000:F799 mov ax, cx F000:F79B and al, 0FCh F000:F79D mov dx, 0CF8h ; dx = порт адреса конфигурационного ; пространства PCI F000:F7A0 out dx, eax F000:F7A2 add dl, 4 ; dx = порт данных конфигурационного ; пространства PCI F000:F7A5 mov al, cl F000:F7A7 and al, 3 F000:F7A9 add dl, al F000:F7AB mov eax, ecx F000:F7AE shr eax, 10h F000:F7B2 out dx, al ; Записываем значение в регистр F000:F7B3 retn F000:F7B3 write_pci_byte endp У меня получается всё как на этой картинке (104 кб) http://s49.radikal.ru/i123/0904/6d/419b1720e2cb.jpg Вроде всё верно, сегменты созданы...данные перемещены. Дизасм код, пока отображается как данные. Захожу по адресу seg000:F77O жму кнопку C, данные переделываются в код...но точно не в такой как в книге F000:F770 mov ax, 8000h (Выходит я не туда смотрю.) Что я делаю не так?