Проблема возникла стандартная после покупки бука DELL D610 на чипсете I915GM решил поменять хард на новый. После замены оригинального 40Гб на 320Гб естественно бук не видит весь объем. Возникла проблема LBA48. Поспрошав Гугль на счет этой проблемы упал было духом, т.к. готовых решений не нашел. вернее они есть но их можно сравнить с операцией по удалению гланд через задний проход, что не кошерно. БИОС не поддерживается более производителем, однако бук DELL D810 на точно таком же чипсете имеет поддержку LBA48 bit. Начал ковырять с boot-block. сей процесс захватил меня целиком, но из-за нехватки знаний столкнулся с проблемами. Вот кусок кода (IDA 5.5): Код (Text): Коменты мои F000:900C ; --------------------------------------------------------------------------- F000:900C F000:900C loc_F900C: ; CODE XREF: F000:8CC0j F000:900C out 80h, al ; manufacture's diagnostic checkpoint F000:900C ; print POST CODE F000:900E mov ah, al ; ah=EB,al=EB F000:9010 mov dx, 910h F000:9013 mov al, 85h ; 'Å' ; ax=EB85 F000:9015 out dx, al ; write al=85 to LPC Generic IO reg.10 F000:9016 inc dx ; dx=11; F000:9017 mov al, ah ; al=EB,ah=85 F000:9019 out dx, al ; write al=EB to LPC Generic IO reg.11 F000:901A mov dx, 910h F000:901D mov al, 94h ; 'Ô' F000:901F out dx, al ; write al=94 to LPC Generic IO reg.10 F000:9020 inc dx ; Increment by 1 F000:9021 mov al, 0 F000:9023 out dx, al ; write al=00 to LPC Generic IO reg.11 F000:9024 F000:9024 loc_F9024: ; CODE XREF: F000:9025j F000:9024 hlt ; Stop proccesor F000:9025 ; --------------------------------------------------------------------------- F000:9025 jmp short loc_F9024 ; Jump F000:9027 ; --------------------------------------------------------------------------- Вопросы знатокам: 1. Что за общие регистры LPC описания в мануале на чипсет не нашел, нашел только установку базового адреса для них (в данном биосе BAR=00000900)? 2. Как проц(или код) выйдет из HLT ? В литературе описаны 2 варианта. Ждем прерывания (какого, если вначале кода стоит cli?[см.поправку]), если оно(прерывание) приходит(от какого устройства?) пишем в стек адрес следующей команды, выполняем процедуру, возвращаемся. Однако следующая команда JMP опять таки на HLT? т.е получается зависон? Второй вариант это RESET, при этом комп вырубится и "мыло-мочало начиная сначала"? Просветите неуча. Спасибо. [Поправка] На самом деле запрет стоит на все прерывания кроме немаскируемых(вектор №2 кажись) NMI#, они всегда будут обработаны процем.
Может быть скажу сейчас полную чушь, но любая ОС, начиная чуть-ли не с Win 9x (в случае с 95 - с какими-то патчами от MS) для работы с диском используют собственные драйвера, не завязанные на int 13 и в целом, на BIOS. У линухов аналогично. То есть если хард все-таки хоть как-то определяется в BIOS, можно создать мелкий основной раздел, пускай на 32Gb, то можно в него и всю винду поставить (Win XP). С семеркой еще проще - создается совсем мелкий раздел, скажем на 100MB, куда пишется mbr, boot, ntkrnl, и тп. А системная директория семеры может уже находиться в следующем разделе (bootable). У линухов все вообще гораздо проще - кернель, а рутфс может быть где угодно...
Дык и я так думал, однако после того как диск слетел в PIO "из-за многочисленных ошибок чтения-записи" решил, что лучше перебдеть, чем потерять ценные данные. В БИОСе объем 137 Гб видится, создал пока 128 Гб раздел, остальное потом когда решение будет найдено. Чипсет ICH6M имеет встроенную поддержку 48 bit LBA 48, реализуется она так же как и ICH7,ICH8 и , через SATA В D610,D810,D510 буках SATA работает как эмулятор IDE, т.е. SATA разъемов нет вообще на материнке. Если в D510,D810 реализована поддержка 48 bit, то и в 610 можно я так думаю.. Продолжим разборки с БИОС: Начало исполнения кода такое: Код (Text): ; --------------------------------------------------------------------------- F000:4248 F000:4248 Start_Prog: ; CODE XREF: F000:loc_F4030j F000:4248 cli ; Clear Interrupt Flag F000:4249 cld ; Clear Direction Flag F000:424A wbinvd ; Invalidate Data Cache (write changes) F000:424C mov ax, cs F000:424E mov ss, ax F000:4250 assume ss:F000 F000:4250 xor esp, esp ; esp=00000000 F000:4253 shl edx, 10h ; save processor data into high F000:4253 ; bits(31:16) of edx F000:4257 mov sp, 425Dh F000:425A jmp Set_PCI_TO_PCI_Brige ; Jump F000:425D ; --------------------------------------------------------------------------- F000:425D F000:425D loc_F425D: ; CODE XREF: F000:72ADJ F000:425D mov sp, 4263h F000:4260 jmp HB_PAM0_SET1 ; Jump F000:4263 ; --------------------------------------------------------------------------- Т.е. отключаем прерывания, и далее отмены этой команды нет, т.е я еще не дошел видимо. Если фрагмент кода в моем первом посте особой роли не играет (тупиковая ветвь), то вот в этом фрагменте Код (Text): F000:458E ; --------------------------------------------------------------------------- F000:458E F000:458E pre_: ; CODE XREF: F000:429FJ F000:458E shl esp, 10h ; save sp old value in high bits F000:4592 mov sp, 4598h F000:4595 jmp HB_SMRAM_READ ; Jump F000:4595 ; --------------------------------------------------------------------------- .... F000:5D2D ; --------------------------------------------------------------------------- F000:5D2D Read registers 9C 9D 9E 9F F000:5D2D defult value: Top of Low Used Dram 9C=00001000b; F000:5D2D System Management RAM Control 9D=00000010b ; F000:5D2D Extended System Management RAM Control 9E=00111000b; F000:5D2D 9F=reserved F000:5D2D F000:5D2D HB_SMRAM_READ: ; CODE XREF: F000:4595j F000:5D2D mov dx, 0CF8h F000:5D30 mov eax, 8000009Ch F000:5D36 out dx, eax ; D0:F0 reg. offset #9C,9D,9E,9F F000:5D36 ; Host Bridge TOLUD(9C),SMRAM(9D), F000:5D36 ; ESMRAMC(9E) F000:5D38 mov dl, 0FDh ; '¤' F000:5D3A in al, dx ; read reg offset 9D F000:5D3A ; from port #0CFDh to al; F000:5D3A ; default al=02h;This 8-bit register F000:5D3A ; defines SMRAM-System Management F000:5D3A ; RAM Control F000:5D3B retn ; return to f000:4598 F000:5D3C ; --------------------------------------------------------------------------- .... F000:4598 off_F4598 dw offset loc_F459A ; CODE XREF: F000:5D3BJ F000:459A ; --------------------------------------------------------------------------- F000:459A F000:459A loc_F459A: ; DATA XREF: F000:off_F4598o F000:459A shr esp, 10h ; sp=42A2 F000:459E test al, 8 ; al=02h<08h F000:45A0 jz short locret_F45A5 ; Jump if Zero (ZF=1) F000:45A2 jmp ready_to_reset ; if 9D not equal 08h jump to F000:45A5 ; ----------------------------------------------------------------------- .... F000:4EC5 ; --------------------------------------------------------------------------- F000:4EC5 F000:4EC5 ready_to_reset: ; CODE XREF: F000:45A2j F000:4EC5 cmp word ptr ds:472h, 1234h ; Is Alt+Ctrl+Del pushed? F000:4ECB jnz short Stop_maschine1 ; No,It isn't pushed; F000:4ECB ; Jump if Not Zero (ZF=0) F000:4ECD mov dl, 40h ; '@' ; Yes,it's pushed! F000:4ECF jmp short Stop_maschine2 ; Jump F000:4ED1 ; --------------------------------------------------------------------------- F000:4ED1 F000:4ED1 Stop_maschine1: ; CODE XREF: F000:4ECBj F000:4ED1 mov dl, 0 F000:4ED3 F000:4ED3 Stop_maschine2: ; CODE XREF: F000:4ECFj F000:4ED3 mov ax, 0DBDBh F000:4ED6 out 70h, al ; CMOS Memory:NMI disable, F000:4ED6 ; reg #5B F000:4ED6 ; F000:4ED8 in al, 71h ; CMOS Memory read reg.#5B F000:4ED8 ; al=xxxx.xxxxb F000:4EDA and al, 0BFh ; set bit #6=0 F000:4EDA ; al=x0xx.xxxxb F000:4EDC or al, dl ; 1)al=x0xx.xxxxb Alt+Ctrl+Del don't F000:4EDC ; 2)al=x1xx.xxxxb Alt+Ctrl+Del push F000:4EDE xchg al, ah ; al=DB; F000:4EE0 out 70h, al ; CMOS Memory: NMI disable, F000:4EE0 ; reg. #5B F000:4EE0 ; F000:4EE2 xchg al, ah ; Exchange Register/Memory with Register F000:4EE4 out 71h, al ; CMOS Memory:write to reg #5B F000:4EE4 ; new al=x0xx.xxxxb or=x1xx.xxxxb F000:4EE6 mov dx, 0CF9h F000:4EE9 mov al, 2 F000:4EEB out dx, al ; RST_CNT - reset system register: F000:4EEB ; write al=02,bits: F000:4EEB ; 7:4=0000-Reserved F000:4EEB ; 3=0-Full reset, F000:4EEB ; 2=0-Reset CPU, F000:4EEB ; 1=1-System Reset,when RST_CPU(bit2) F000:4EEB ; does 1, it will hard proc. reset F000:4EEB ; 0=0-Reserved F000:4EEC mov al, 6 F000:4EEE out dx, al ; RST_CNT - reset system register: F000:4EEE ; write al=06- hard reset proc. F000:4EEE ; 7:4=0000-Reserved F000:4EEE ; 3=0-Full reset, F000:4EEE ; 2=1-Reset CPU, HARD RESET F000:4EEE ; 1=1-System Reset,when RST_CPU(bit2) F000:4EEE ; does 1, it will hard proc. reset F000:4EEE ; 0=0-Reservedbit2=1-RO F000:4EEE ; F000:4EEF F000:4EEF loc_F4EEF: ; CODE XREF: F000:4EF0j F000:4EEF hlt ; Stop maschine, proc wait reset or interrupt! F000:4EEF ; Into stack has cs:ip=F000:42A2 F000:4EF0 ; --------------------------------------------------------------------------- F000:4EF0 jmp short loc_F4EEF ; Jump F000:4EF2 ; --------------------------------------------------------------------------- Он играет ключевую роль.Опять этот HLT!! Причем данный кусок кода появляется в самом начале. Не понимаю..
Вот тут тоже вроде чуваки замарачиваются по теме: http://forums.mydigitallife.info/threads/22076-Latitude-D610-request-fix-for-137GB-BIOS-limit и вроде-бы даже чего-то там у них получилось в конце концов, хотя и с небольшими косячками в плане ethernet
Дык это я и называю глынды через ж.., читал. Автор темы как раз вопрошал кто возьмется за disasm, иначе проблему не решить, т.к. чипсет один, но разное наполнение у этих буков Здесьhttp://forums.mydigitallife.info/threads/12962-Dell-bios-how-to-decompose-mod./page52 и далее я даже пытался вопрошать, но ответов не получил. Добавление: но самый главный вопрос, который я не в состоянии понять это команда Код (Text): F000:4FF8 lidt fword ptr cs:byte_F48EC ; Lidt=000000000400h F000:4FF8 ; adress base:00000000h F000:4FF8 ; limit:0400h F000:4FFF xor esp, esp ; esp=0 F000:5002 mov eax, cr0 ; Move to/from Special Registers F000:5005 and al, 0FEh ; Logical AND F000:5007 mov cr0, eax ; write into cr0 new value F000:5007 ; cr0=60000010 Processor F000:5007 ; work in Real mode aka R_Mod F000:500A jmp far ptr unk_FFFA0 ; Jump to standstill F000:500A ; --------------------------------------------------------------------------- ..... В WinHEXe по этому адресу Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000FFFA0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF яяяяяяяяяяяяяяяя jmp far ptr unk_FFFA0. Куда передается управление? Сам бинарный код команды jmp выглядит так: Код (Text): Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000F5000 EA A0 FF 00 F0 ê ÿ ð Очевидно, что этот адрес не из БИОС либо ИДА врет, хотя врет она крайне редко. Такую конструкцию встретил еще в нескольких 0.5-1 Мб Биосах Делл.
и т.д. Точно не уверен, но скорее всего это переход в режим адресации всей памяти(flat memory). jmp не выполняется, а просто попадаем на следующую команду уже в этом режиме.
есть вариант установить линуксовский биос. в поиске поиши(coreboot) вроде. если чипсет поддерживается, то можно и попробовать. все легче чем пол биоса разберать. с другой стороны есть утилиты позволяющие выташить биос и разбить его на модули. тогда будет возможност заменить модуль на новый и собрать обратно.
Спасибо посмотрю, о результате отпишу! Линуксовский биос останется как ласт хоуп, т.е. последняя надежда. Прога которая разбирает DELL BIOS на модули у меня есть. Я все три биоса (510,610,810)разбирал, сравнивал по-модульно. Но как оказалось -не все так просто. Адресация в каждом БИОСЕ своя кроме того различия есть в железе. Самое минимальное отличие по железу-между D610 и D810: у первого встроенная графика у второго видеокарта, но у D810 еще куча дополнительных модулей в БИОСе и он (БИОС) самый свежий. Поэтому я выбрал такой алгоритм действий: 1. Разбираю бут блок смотрю базовую адресацию всех регистров 2. Пишу малюсенький код , который активирует FIS регистр и вставляю в БИОС как ISA или ROM модуль. Это в идеале, реальность как всегда можеть быть совсем другой. Разбор бут блока пока особых трудностей не доставляет кроме тех вопросов что я задавал в начале поста.
http://e-zine.excode.ru/online/2/code_safe_mode.html Код (Text): mov eax, cr0 ; Считываем значение CR0 and al, 0feh ; Сбрасваем нулевой бит в 0 mov cr0, eax ; Переходим в реальный режим Тут как раз про lidt спрашивают. http://forum.sources.ru/index.php?showtopic=298282 Код (Text): Setup_RM: mov AX, SYS_REAL_DS mov DS, AX mov ES, AX mov SS, AX mov EAX, cr0 and AL, 0FEh mov cr0, EAX jmp 0:Enter_RM ; DB 0EAh ; DW Enter_RM ; DW 0 Enter_RM: mov AX, CS mov DS, AX Но судя по расшифровке jmp - у тебя переход в F000:FFA0 но вот как работает сегмент в реал-режиме? Надо читать и разбираться
valterg Не работает. Приходим к "Stop maschine" в результате. Хороший ресурс пойду почитаю. Спасибо за наводку!
aascut Позволю себе несколько hints by Captain Obvious: Код (Text): lidt fword ptr cs:byte_F48EC Это загрузка (инициализация) дескриптора прерываний. Ранее должен быть подготовлен этот самый дескриптор - сколько прерываний - и дескриптор на каждое из них. Возможно также перепрограммирование контроллера прерываний - установка таблицы векторов не с адреса 0000:0000. Код (Text): jmp far ptr unk_FFFA0. Куда передается управление? После того как подготовлено все для перехода в режим ProtectedMode (а именно в этом месте вы сейчас и смотрите) процессор воспринимает команды jmp/call far или iret иначе - сегментный адрес это уже не сегмент (как в RealMode), а индекс в таблице GDT. Смотрите как (выше) инициализирована GDT - находите соответствующий дескриптор (должен быть CODE) и уже относительно базы этого дескра отщитывете указанное смещение в команде. Рекомендация: возьмите пример какой-нибудь простой демо-проги переводящей проц в PM - станет гораздо проще
++ По поводу первого вопроса. Очевидно ключевыми являются все последние команды записи в порты (out) непосредственно перед HLT. HLT и цыкл служит для гарантированного замораживания кода до получения управления неким обработчегом. Что это может быть за обработчег? Действительно есть смысл смотреть какие обработчики прерываний уже инициализированы (особенно непосредственно перед OUT'ами). Я сомневаюсь что это NMI, больше похоже на SMM, хотя в 93' его еще не было (?). Если это действительно SMM, то его в дампе вообще нет - его нужно дампить отдельно. Смотреть описание чипсету - для чего нужны эти порты. Смотреть через весь код (особенно на обработчики прерывания) которые извлекают адрес прерыванной команды и пытаются чекать hlt+jmp и скипают их (если находят).
PSR1257II Елки, все-таки прерывания. Такая мысля у меня висела в подсознании с самого начала. Но этот вопрос для меня самый трудный для понимания. Просветления пока нету. Дополнение: код БИОС DELL D4700 (Intel 915G), таже конструкция: Код (Text): F000:9303 ; --------------------------------------------------------------------------- F000:9303 F000:9303 loc_79303: ; CODE XREF: F000:92DCj F000:9303 ; F000:92F5j F000:9303 add bp, 8 ; Add F000:9306 cmp bp, 92A2h ; Сравниваем F000:930A jb short loc_792C5 ; если меньше то Jump на вычисление ; нового значения bp F000:930C xor esp, esp ; esp=00000000h; F000:930F jmp far ptr 0F000h:0FFA0h ; Jump F000:9314 ; --------------------------------------------------------------------------- .... В этом коде все немного проще но и там и там конструкция jmp far ptr 0F000h:0FFA0h ключевая для определения ветвления БИОС. Дополнение2: Это самое начало кода, после CLI, установки пары регистров в ICH и MCH, типа PCI I/O-enable и HIMEM-enable.Проц в реальном режиме и никуда не собирается переключаться, где он переключается я нашел, но это после выполнения этого JUMP. Почему в D810 загружается таблица прерываний не пойму, она и так по умолчанию по этому адресу сидит. Значение 48 битное слово -0000000400h Код (Text): Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000F48E0 00 04 00 00 000F48F0 00 00
aascut Упс, я слегка прогнал - это не переход в PM а наоборот переход из PM в RealMode: Код (Text): F000:4FF8 lidt fword ptr cs:byte_F48EC ; Lidt=000000000400h F000:4FF8 ; adress base:00000000h F000:4FF8 ; limit:0400h Дескриптор таблицы прерываний указывает на сейчас на базу 0h (те физический! адрес с 0) - именно так как в RealMode/после сброса процессора и размер таблицы как раз соответствует 100h прерываниям: 100h*4=400h (4 байта на каждое прерывание). Это как раз СБРОС PE-бита. Те после этого машина будет работать в RealMode. Сорри. Код (Text): F000:500A jmp far ptr unk_FFFA0 ; Jump to standstill Это переход на адрес f000:ffa0. Просто откройте этот адрес в IDA - я не знаю чего она тупит и не показывает это автоматом. Т.е если Сейчас вы тут, то после этого джампа вы уже тут: WinHex'ом смотреть память слегка наивно - нужно сделать загрузочную дискету/win98/etc и сразу после перехода в "DOS" дампить всю память (например с адресов C0000 до FFFFF).
Дык я ж уже писАл, что А память к этому моменту еще не инициализирована, т.е. ее как бы вообще не существует. Мы то знаем что она есть а проц и чипсет об этом еще не догадываются. Поэтому у меня такая гипотеза: Когда БИОС определил, что 1 шаг)в регистре PCI_TO_PCI bridge D30:F0 offset 1C-1D(IOBASE_LIMIT) значения лимита =EFFF и базы = F000, устанавливаем в регистре D30:F0 offset 04-05 (PCI_CMD) бит0=1 -I/O Enable, Итог: F000:0000-F000:EFFF=I/O PCI пространство, разрешено. 2 шаг) запись значения 0000h в MCH регистр D0:F0 offset 90-93 (Programm Atribute Map 0), что означает DRAM-disable, все обращения чтения-записи идут через DMI; 3 шаг) запуск подпрограммы вычисления адреса модуля, дело в том что весь бут блок разбит на маленькие модули, подпрограмма вычисляет адрес, прыгаем туда, устанавливаем значения регистров, прыгаем обратно для вычисления адреса следующего модуля и т.д; Так вот 1 модуль это проверка условия выключения компа, читаем CMOS регистр 0F, смотрим условия выключения. Сравниваем с числом 4, если меньше прагаем обратно в подпрограмму вычисления адреса, которая дает нам новый адрес модуля описанного мной в посте #5, приведу его полностью: Код (Text): F000:4FE2 ; --------------------------------------------------------------------------- F000:4FE2 F000:4FE2 eShn: ; CODE XREF: F000:429Fj F000:4FE2 mov sp, 4FE8h F000:4FE5 jmp HB_PAM0_SET2 ; Jump ... F000:5E9C ; --------------------------------------------------------------------------- F000:5E9C F000:5E9C HB_PAM0_SET2: ; CODE XREF: F000:4FE5j F000:5E9C mov dx, 0CF8h F000:5E9F mov eax, 80000090h F000:5EA5 out dx, eax ; Dev.0,Func.0, reg offset 90-93 F000:5EA5 ; Host Bridge Program. Atribute Map 0 F000:5EA5 ; 0F0000-0FFFFF Attribute (HIENABLE): F000:5EA5 ; This field controls the steering of F000:5EA5 ; read and write cycles that address F000:5EA5 ; the BIOS area from 0F0000 to 0FFFFF. F000:5EA7 mov dl, 0FCh ; '¹' F000:5EA9 mov al, 10h F000:5EAB out dx, al ; write reg.offset 90-93 (HIEnable) F000:5EAB ; new value al=00010000b F000:5EAB ; bits(5:4)=01,= Read only F000:5EAB ; all read from DRAM F000:5EAB ; all writes to DMI F000:5EAC jmp sp ; sp=4FE8 F000:5EAC ; --------------------------------------------------------------------------- .... F000:4FE8 ; --------------------------------------------------------------------------- F000:4FE8 F000:4FE8 loc_F4FE8: ; CODE XREF: F000:HB_PAM0_SET2j F000:4FE8 ; F000:5EACJ F000:4FE8 mov al, 0E2h ; 'ò' F000:4FEA out 70h, al ; CMOS Memory: F000:4FEA ; NMI disable, reg.offset 62? F000:4FEA ; F000:4FEC in al, 71h ; CMOS Memory, read reg.value F000:4FEC ; al=xx F000:4FEE mov dh, al ; dl=xx F000:4FF0 mov al, 0E3h ; 'ó' F000:4FF2 out 70h, al ; CMOS Memory: F000:4FF2 ; NMI disable, reg.offset 63? F000:4FF2 ; F000:4FF4 in al, 71h ; CMOS Memory, read reg.value F000:4FF6 mov dl, al ; In reg have value dx=[62]:[63] F000:4FF6 ; =xxxxh,CMOS offsets F000:4FF8 db 66h F000:4FF8 lidt fword ptr cs:byte_F48EC ; Lidt=000000000400h F000:4FF8 ; adress base:00000000h F000:4FF8 ; limit:0400h F000:4FFF xor esp, esp ; esp=0 F000:5002 mov eax, cr0 ; read cr0 F000:5005 and al, 0FEh ; write 0 to bit 0 F000:5007 mov cr0, eax ; write into cr0 new value F000:5007 ; cr0=60000010 Processor F000:5007 ; bits(30:29) CD = 1 NW=1 F000:5007 ; "Strict memory ordering is not F000:5007 ; enforced unless the MTRRs are F000:5007 ; disabled and/or all memory is F000:5007 ; referenced as uncached" F000:5007 ; work in Real mode aka R_Mod F000:500A jmp far ptr unk_FFFA0 ; jump where?? bin: EA A0 FF 00 F0 F000:500A ; --------------------------------------------------------------------------- шаг 4) Переход по адресу.Может этот переход быть адресацией какого либо устройства? Ведь адрес FFFA0 должен быть из DRAM которой нет! Может этим устройством быть контроллер 8051? В нем есть память, регистры, зашитый в него код? Ведь dx=[62]:[63]=xxxxh должно быть как-то использовано.
Честно говоря я вообще не понимаю, зачем вы разбираете инициализацию? Надо имхо смотреть где происходит детект HDD. На все остальное можно положить..
aascut Может быть но я сильно сомневаюсь. Может быть можно закрыть память через специфичные функции чипсета. Но имхо врядли. Вот инфа из Wiki: Так что ваш адрес F000:FFA0 is well below that initial address! (F000:FFF0). Просто откройте в IDA это смещение (F000:FFA0) - что там? Если там вменяемый код - то все логично. Ту прогу что вы привели выше - это больше похоже на какую-то инициализацию чипсета (порт CF8h-CFCh) и далее просто запрет (или разрешение) NMI и переход в RealMode. С большой вероятностью это один из тестов (или инициализация) который требует PM. Например подсчет размера памяти или ее тест. В принципе вы правы. Но интересно же
++ Если вы пытаетесь читать эту память из винды - то да, действительно эта память может быть УЖЕ закрыта (линия A20 или что-то в этом роде). Читать нужно "из DOS". Ваш модуль в IDA - вы что его, WinHex'ом получили что-ли?!?
Tronix Еслиб я знал, где.. Возможно произошло недопонимание. Я просто взял хххххх.ROM из проги обновления БИОСА для другого бука,открыл его в иде, создал сегмент 64 кб последних байт, поставил курсор на F000:FFF0 нажал кнопку С и понеслось.. PSR1257II А чем можно сдампить память из ДОСа, в смысле прогу посоветуйте.
Да напишите сами простейшую - на ассемблере/pascal/C - очень просто - нужен буфер (допустим размером с сегмент) - читаем в цикле сегменты C000,D000,E000 и F000 и в файл. Отладить можно в винде, но дампить нужно из "dos" (сделайте загрузочный диск в XP или просто укажите что-то типа VC.com (VolkovCommander) в autoexec.bat для Win98. Раз вы взяли .ROM, то должно быть все в порядке ... однако кто сказал что это должен быть идентичный образ памяти? Проверить не мешает Работу с hdd нужно смотреть по характерными командам с hdd, допустим можно начать с поиска работы с портами 170..176h (или 1F0..1F6h) - пишу по-памяти, нужно уточнить. Команды rep insb/insw могут быть частью чтения сектора или серийного номера HDD - например чтения MBR. Гуглите как "обычно" идет работа с HDD и далее ищите в дизасме характерные константы или команды - для нескольких сегментов это не так-то много смотреть...