Здравствуйте! Подскажите, пож-ста, кто может: пытаюсь дизассемблировать видеоБИОС (GF6800, IDAPro5.0), есть там такая конструкция в самомо начале: seg000 segment byte public '' use16 assume cs:seg000 seg000:0000 word_0 dw 0AA55h ; Сигнатура БИОС плат расширения seg000:0003 jmp short loc_50 ; Точка входа seg000:0048 byte_48 db 0 ;XRef-ов полно, все типа "test cs:byte_48, хх" seg000:0050 loc_50 jmp loc_D4EF seg0004EF loc_D4EF test cs:byte_48, 1 jz Как я понимаю, cs:byte_48 указывает на word_0 (55h), только чего этим хотят проверить? Про изменения значения byte_48 ничего не нашёл в стандартных заголовках, он сам по себе, этим кодом в него, вроде, ничего не пишется...
В память-то? Не знаю... Что посоветуете почитать вкупе с pci21.pdf&vbecore3.pdf? Непонятно, где находится PCI Configuration Space.
Я разбирал давно video bios с GeForce FX5200 (глючила в text-mode со шрифтами 8 на 14, нвидиа пи#$%&сы) . Там на ROM header XREF'ы только на байт размера модуля (в 512-байтовых страницах который). Все остальные -- от вы#$онов Иды, вроде call cs:[si+1] где она сдуру решала что +1 -- это offset второго байта в ROM header'е. Начинать там лучше не с точки входа в POST init, а с entrypoint'a int 10h. Найти точку входа в int 10h можно в IDT, но там оно скорее всего будет перехвачено и возможно понадобится потрейсить отладчиком. Есть альтернативный способ -- недалеко от начала кода POST-инициализации (т.е. если идти c ROM entrypoint'a -- ROM:0003) есть характерная процедура иниц-ии векторов и указателей: Код (Text): init_ints_and_BDA proc near ; CODE XREF: VBIOS:E6D6p pushf ; DS = 0 cli mov word ptr ds:40h, offset NVBIOS_EntryPoint mov word ptr ds:42h, cs mov word ptr ds:7Ch, offset Font_8_by_8 mov word ptr ds:7Eh, cs mov word ptr ds:108h, 0F065h ; orig Int10h handler mov word ptr ds:10Ah, 0F000h mov word ptr ds:10Ch, offset CharTable mov word ptr ds:10Eh, cs mov word ptr ds:1B4h, offset NVBIOS_EntryPoint mov word ptr ds:1B6h, cs mov word ptr ds:4A8h, offset VSPT mov word ptr ds:4AAh, cs popf retn init_ints_and_BDA endp NVIOS_Entrypoint и есть точка входа в int 10h. Байт по смещению 48h -- это как в моей, так и в твоей прошивке, набор флагов, управляющий работой прошивки. Он, очевидно, предназначен для манипулирования прошивкой без ее рекомпиляции, т.е. для патча разработчиками для своих целей вроде тестирования/отладки и тп. В частности он влияет на проверку контрольной суммы модуля -- бит 0 (test byte48, 1). В моей прошивке все флаги были сброшены в 0.
_BC_ Что за IDT? Какая-то IDTable? Описана где-нибудь? _BC_ Не понял, что потрейсить отладчиком? Как БИОС отрабатывает на реальном железе? Это же невозможно?
Interrupt Descriptor Table. Описание читаем в мануалах по защищенному режиму. Команды для работы с ней - lidt, sidt.
мм, по-моему ты рановато за это взялся. IDT = таблица прерываний (c 0000:0000 в real-mode/V86). Трассировать перехваченный int10h не надо -- из фрагмента видно, что нвидиа, как и остальные, хранит указатель на оригинальный обработчик int10h в векторе int 6Dh. Трассировать видеобиос или драйвера видеокарт (типа nvmini.vxd) вообще само по себе потрясающее занятие кстати.
Не думал, что это всё так глубоко зарыто... Ткни меня, пож-ста, носом, где "из фрагмента видно, что нвидиа, как и остальные, хранит указатель на оригинальный обработчик int10h в векторе int 6Dh." Может, есть какие материалы по этому поводу (исходники, например, кроме nv15_bios_sources.zip?) Именно по теме видеоБИОСов, общего плана у меня есть.
Код (Text): mov word ptr ds:40h, offset NVBIOS_EntryPoint <-- int 10h, будет перехвачен mov word ptr ds:42h, cs ... mov word ptr ds:1B4h, offset NVBIOS_EntryPoint <-- int 6Dh, останется нетронутым mov word ptr ds:1B6h, cs Вот еще цитата с Р. Брауна:
2yoric А ты посмотри внимательнее, можут быть где-то в коде это флажок (byte_48) изменяется? Тогда ты можешь из констекста понять его смысл.
Ой, давно я тут не был. Не уведомляет по почте что-то... Понятно, из иходников nv15_bios_sources видно, что оно модифицируется после загрузки кода в ОЗУ (если только), в общем, проехали. Так а исходников БИОС для nv40 и подобного никто нигде не встречал? ; These locations are the DDC Read/Write ports ; *********************************************************** org 048h ; dword 0 ; 4 bytes public Internal_Flags Internal_Flags label byte db 00000001b ; BIOS Internal flags ; ^^^^^^^^ ; | | | | | | |+------- Engineering Release ; +++++++-------- Reserved ; public Internal_Flags2 Internal_Flags2 label byte db 00000000b ; BIOS Internal Flags #2 ; ^^^^^^^^ ; | | | | | | |+------- Disable Head A SR1[5] on DFP ; | | | | | |+-------- Use IRET instead of RETF on NoSTIHandler ; ++++++--------- Reserved dw 0 ; 2 bytes dword 0 ; 4 bytes Каокй-то синтаксис не такой. dword - я так понимаю, это dd?
А это что за BAD ADDR, просветите? seg000:5F1D 000 push bp seg000:5F1E 002 mov bp, sp seg000:5F20 002 db 83h,0C4h,0C8h ; <BAD>add sp, 0FFC8h seg000:5F23 002 imul eax, 0Ah seg000:5F27 002 mov [bp-16h], eax seg000:5F2B 002 mov dword ptr [bp-26h], 0FFFFh seg000:5F33 002 mov byte ptr [bp-34h], 0Dh
Уезжал тему не заметил. yoric А какой смысл дизассемблировать биос? Сам долго в нем не ковырялся. Сразу нашел таблиц tblHandlerVESA - список точек входа в функции vesa. На этом и остановился. Зачем исходники БИОС когда, есть драверя для линукса. (Copyright 2003 NVIDIA, Corporation. All rights reserved.) http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/hw/xfree86/drivers/nv/ Да dword это dd. DDC это конал связи с монитором. Там I2C интерфейс. По этому каналу видео карта получает информацию о мониторе. И по немуже может управлять различными настройками монитора.
Pavia Так оно это, без драйверов (в линукс-консоли, в досе, до загрузки ОС) вентилятор работает на полных оборотах, воет, изнашивается, на нервы действует. Под драйвером- обороты управляются в соответствии с таблицами производительности (ТП). Хочу сбросить обороты без драйверов. Pavia Да это-то находится, но мне не надо. Прекрасно видны ТП, но не вижу к ним обращений. Из исходников nvclock: /* Fanspeed code for Geforce6800 hardware */ float nv40_get_fanspeed() { /* Bit 26-16 of register 0x10f0 control the voltage for the pwm signal generator in 0.1% / that is connected to the fan. By changing the value in the register the duty cycle / can be controlled so that the fan turns slower or faster. / The value stored in the registers needs to be inverted, so a value of 10% means 90% and so on. */ float fanspeed = (1000 - ((nv_card.PMC[0x10f0/4] >> 16) & 0x3ff))/10; return fanspeed; } Вот в БИОСе не найду никак обращений к порту 10f0. Pavia Даже в драйверах для линукса от самой NVidia в исходниках только видеорежимы, более тонкие настройки в виде *.o, дизассемблировать который ещё мрачнее БИОСа.
yoric Это не порт, это регистр отоброженный в память. Но я думаю что можно и через порты достучаться, скорее всего весит на I2C.
А всё таки что это за <BAD>add sp, 0FFC8h, просветите? In ProblemList в IDA этого нету. Не смогла проинтерпретировать код, а потом подхватила как ни в чём не бывало? seg000:5F1E 002 mov bp, sp seg000:5F20 002 db 83h,0C4h,0C8h ; <BAD>add sp, 0FFC8h seg000:5F23 002 imul eax, 0Ah