Ковыряние DELL (Phoenix 1993) BIOS

Тема в разделе "WASM.RESEARCH", создана пользователем aascut, 2 сен 2011.

  1. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Проблема возникла стандартная после покупки бука DELL D610 на чипсете I915GM решил поменять хард на новый. После замены оригинального 40Гб на 320Гб естественно бук не видит весь объем. Возникла проблема LBA48. Поспрошав Гугль на счет этой проблемы упал было духом, т.к. готовых решений не нашел. вернее они есть но их можно сравнить с операцией по удалению гланд через задний проход, что не кошерно. БИОС не поддерживается более производителем, однако бук DELL D810 на точно таком же чипсете имеет поддержку LBA48 bit.
    Начал ковырять с boot-block. сей процесс захватил меня целиком, но из-за нехватки знаний столкнулся с проблемами. Вот кусок кода (IDA 5.5):
    Код (Text):
    1. Коменты мои
    2. F000:900C ; ---------------------------------------------------------------------------
    3. F000:900C
    4. F000:900C loc_F900C:                              ; CODE XREF: F000:8CC0j
    5. F000:900C                 out     80h, al         ; manufacture's diagnostic checkpoint
    6. F000:900C                                         ; print POST CODE
    7. F000:900E                 mov     ah, al          ; ah=EB,al=EB
    8. F000:9010                 mov     dx, 910h
    9. F000:9013                 mov     al, 85h ; 'Å'   ; ax=EB85
    10. F000:9015                 out     dx, al          ; write al=85 to LPC Generic IO reg.10
    11. F000:9016                 inc     dx              ; dx=11;
    12. F000:9017                 mov     al, ah          ; al=EB,ah=85
    13. F000:9019                 out     dx, al          ; write al=EB to LPC Generic IO reg.11
    14. F000:901A                 mov     dx, 910h
    15. F000:901D                 mov     al, 94h ; 'Ô'
    16. F000:901F                 out     dx, al          ; write al=94 to LPC Generic IO reg.10
    17. F000:9020                 inc     dx              ; Increment by 1
    18. F000:9021                 mov     al, 0
    19. F000:9023                 out     dx, al          ; write al=00 to LPC Generic IO reg.11
    20. F000:9024
    21. F000:9024 loc_F9024:                              ; CODE XREF: F000:9025j
    22. F000:9024                 hlt                     ; Stop proccesor
    23. F000:9025 ; ---------------------------------------------------------------------------
    24. F000:9025                 jmp     short loc_F9024 ; Jump
    25. F000:9027 ; ---------------------------------------------------------------------------
    Вопросы знатокам:
    1. Что за общие регистры LPC описания в мануале на чипсет не нашел, нашел только установку базового адреса для них (в данном биосе BAR=00000900)?
    2. Как проц(или код) выйдет из HLT ? В литературе описаны 2 варианта. Ждем прерывания (какого, если вначале кода стоит cli?[см.поправку]), если оно(прерывание) приходит(от какого устройства?) пишем в стек адрес следующей команды, выполняем процедуру, возвращаемся. Однако следующая команда JMP опять таки на HLT? т.е получается зависон?
    Второй вариант это RESET, при этом комп вырубится и "мыло-мочало начиная сначала"?
    Просветите неуча. Спасибо.
    [Поправка] На самом деле запрет стоит на все прерывания кроме немаскируемых(вектор №2 кажись) NMI#, они всегда будут обработаны процем.
     
  2. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Может быть скажу сейчас полную чушь, но любая ОС, начиная чуть-ли не с Win 9x (в случае с 95 - с какими-то патчами от MS) для работы с диском используют собственные драйвера, не завязанные на int 13 и в целом, на BIOS. У линухов аналогично. То есть если хард все-таки хоть как-то определяется в BIOS, можно создать мелкий основной раздел, пускай на 32Gb, то можно в него и всю винду поставить (Win XP). С семеркой еще проще - создается совсем мелкий раздел, скажем на 100MB, куда пишется mbr, boot, ntkrnl, и тп. А системная директория семеры может уже находиться в следующем разделе (bootable). У линухов все вообще гораздо проще - кернель, а рутфс может быть где угодно...
     
  3. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Дык и я так думал, однако после того как диск слетел в PIO "из-за многочисленных ошибок чтения-записи" решил, что лучше перебдеть, чем потерять ценные данные. В БИОСе объем 137 Гб видится, создал пока 128 Гб раздел, остальное потом когда решение будет найдено. Чипсет ICH6M имеет встроенную поддержку 48 bit LBA 48, реализуется она так же как и ICH7,ICH8 и , через SATA
    В D610,D810,D510 буках SATA работает как эмулятор IDE, т.е. SATA разъемов нет вообще на материнке. Если в D510,D810 реализована поддержка 48 bit, то и в 610 можно я так думаю..

    Продолжим разборки с БИОС:
    Начало исполнения кода такое:
    Код (Text):
    1.  ; ---------------------------------------------------------------------------
    2. F000:4248
    3. F000:4248 Start_Prog:                             ; CODE XREF: F000:loc_F4030j
    4. F000:4248                 cli                       ; Clear Interrupt Flag
    5. F000:4249                 cld                     ; Clear Direction Flag
    6. F000:424A                 wbinvd                ; Invalidate Data Cache (write changes)
    7. F000:424C                 mov     ax, cs
    8. F000:424E                 mov     ss, ax
    9. F000:4250                 assume ss:F000
    10. F000:4250                 xor     esp, esp        ; esp=00000000
    11. F000:4253                 shl     edx, 10h        ; save processor data into high
    12. F000:4253                                             ; bits(31:16) of edx
    13. F000:4257                 mov     sp, 425Dh
    14. F000:425A                 jmp     Set_PCI_TO_PCI_Brige ; Jump
    15. F000:425D ; ---------------------------------------------------------------------------
    16. F000:425D
    17. F000:425D loc_F425D:                              ; CODE XREF: F000:72ADJ
    18. F000:425D                 mov     sp, 4263h
    19. F000:4260                 jmp     HB_PAM0_SET1    ; Jump
    20. F000:4263 ; ---------------------------------------------------------------------------
    Т.е. отключаем прерывания, и далее отмены этой команды нет, т.е я еще не дошел видимо. Если фрагмент кода в моем первом посте особой роли не играет (тупиковая ветвь), то вот в этом фрагменте
    Код (Text):
    1. F000:458E ; ---------------------------------------------------------------------------
    2. F000:458E
    3. F000:458E pre_:                                   ; CODE XREF: F000:429FJ
    4. F000:458E                 shl     esp, 10h        ; save sp old value in high bits
    5. F000:4592                 mov     sp, 4598h
    6. F000:4595                 jmp     HB_SMRAM_READ   ; Jump
    7. F000:4595 ; ---------------------------------------------------------------------------
    8. ....
    9. F000:5D2D ; ---------------------------------------------------------------------------
    10. F000:5D2D Read registers 9C 9D 9E 9F
    11. F000:5D2D defult value: Top of Low Used Dram 9C=00001000b;
    12. F000:5D2D System Management RAM Control 9D=00000010b ;
    13. F000:5D2D Extended System Management RAM Control 9E=00111000b;
    14. F000:5D2D 9F=reserved
    15. F000:5D2D
    16. F000:5D2D HB_SMRAM_READ:                          ; CODE XREF: F000:4595j
    17. F000:5D2D                 mov     dx, 0CF8h
    18. F000:5D30                 mov     eax, 8000009Ch
    19. F000:5D36                 out     dx, eax         ; D0:F0 reg. offset #9C,9D,9E,9F
    20. F000:5D36                                         ; Host Bridge TOLUD(9C),SMRAM(9D),
    21. F000:5D36                                         ; ESMRAMC(9E)
    22. F000:5D38                 mov     dl, 0FDh ; '¤'
    23. F000:5D3A                 in      al, dx          ; read reg offset 9D
    24. F000:5D3A                                         ; from port #0CFDh to al;
    25. F000:5D3A                                         ; default al=02h;This 8-bit register
    26. F000:5D3A                                         ; defines SMRAM-System Management
    27. F000:5D3A                                         ; RAM Control
    28. F000:5D3B                 retn                    ; return to f000:4598
    29. F000:5D3C ; ---------------------------------------------------------------------------
    30. ....
    31. F000:4598 off_F4598       dw offset loc_F459A     ; CODE XREF: F000:5D3BJ
    32. F000:459A ; ---------------------------------------------------------------------------
    33. F000:459A
    34. F000:459A loc_F459A:                              ; DATA XREF: F000:off_F4598o
    35. F000:459A                 shr     esp, 10h        ; sp=42A2
    36. F000:459E                 test    al, 8           ; al=02h<08h
    37. F000:45A0                 jz      short locret_F45A5 ; Jump if Zero (ZF=1)
    38. F000:45A2                 jmp     ready_to_reset  ; if 9D not equal 08h jump to
    39. F000:45A5 ; -----------------------------------------------------------------------
    40. ....
    41. F000:4EC5 ; ---------------------------------------------------------------------------
    42. F000:4EC5
    43. F000:4EC5 ready_to_reset:                                      ; CODE XREF: F000:45A2j
    44. F000:4EC5                 cmp     word ptr ds:472h, 1234h ; Is Alt+Ctrl+Del pushed?
    45. F000:4ECB                 jnz     short Stop_maschine1     ; No,It isn't pushed;
    46. F000:4ECB                                                            ; Jump if Not Zero (ZF=0)
    47. F000:4ECD                 mov     dl, 40h ; '@'                ; Yes,it's pushed!
    48. F000:4ECF                 jmp     short Stop_maschine2    ; Jump
    49. F000:4ED1 ; ---------------------------------------------------------------------------
    50. F000:4ED1
    51. F000:4ED1 Stop_maschine1:                         ; CODE XREF: F000:4ECBj
    52. F000:4ED1                 mov     dl, 0
    53. F000:4ED3
    54. F000:4ED3 Stop_maschine2:                         ; CODE XREF: F000:4ECFj
    55. F000:4ED3                 mov     ax, 0DBDBh
    56. F000:4ED6                 out     70h, al         ; CMOS Memory:NMI disable,
    57. F000:4ED6                                             ; reg #5B
    58. F000:4ED6                                             ;
    59. F000:4ED8                 in      al, 71h           ; CMOS Memory read reg.#5B
    60. F000:4ED8                                             ; al=xxxx.xxxxb
    61. F000:4EDA                 and     al, 0BFh        ; set bit #6=0
    62. F000:4EDA                                             ; al=x0xx.xxxxb
    63. F000:4EDC                 or      al, dl            ; 1)al=x0xx.xxxxb Alt+Ctrl+Del don't
    64. F000:4EDC                                            ; 2)al=x1xx.xxxxb Alt+Ctrl+Del push
    65. F000:4EDE                 xchg    al, ah          ; al=DB;
    66. F000:4EE0                 out     70h, al         ; CMOS Memory: NMI disable,
    67. F000:4EE0                                            ; reg. #5B
    68. F000:4EE0                                            ;
    69. F000:4EE2                 xchg    al, ah          ; Exchange Register/Memory with Register
    70. F000:4EE4                 out     71h, al         ; CMOS Memory:write to  reg #5B
    71. F000:4EE4                                            ; new al=x0xx.xxxxb or=x1xx.xxxxb
    72. F000:4EE6                 mov     dx, 0CF9h
    73. F000:4EE9                 mov     al, 2
    74. F000:4EEB                 out     dx, al          ; RST_CNT - reset system register:
    75. F000:4EEB                                            ; write al=02,bits:
    76. F000:4EEB                                            ; 7:4=0000-Reserved
    77. F000:4EEB                                            ; 3=0-Full reset,
    78. F000:4EEB                                           ; 2=0-Reset CPU,
    79. F000:4EEB                                           ; 1=1-System Reset,when RST_CPU(bit2)
    80. F000:4EEB                                           ; does 1, it will hard proc. reset
    81. F000:4EEB                                           ; 0=0-Reserved
    82. F000:4EEC                 mov     al, 6
    83. F000:4EEE                 out     dx, al          ; RST_CNT - reset system register:
    84. F000:4EEE                                           ; write al=06- hard reset proc.
    85. F000:4EEE                                            ; 7:4=0000-Reserved
    86. F000:4EEE                                            ; 3=0-Full reset,
    87. F000:4EEE                                            ; 2=1-Reset CPU, HARD RESET
    88. F000:4EEE                                           ; 1=1-System Reset,when RST_CPU(bit2)
    89. F000:4EEE                                           ; does 1, it will hard proc. reset
    90. F000:4EEE                                           ; 0=0-Reservedbit2=1-RO
    91. F000:4EEE                                           ;
    92. F000:4EEF
    93. F000:4EEF loc_F4EEF:                              ; CODE XREF: F000:4EF0j
    94. F000:4EEF                 hlt                     ; Stop maschine, proc wait reset or interrupt!
    95. F000:4EEF                                         ; Into stack has cs:ip=F000:42A2
    96. F000:4EF0 ; ---------------------------------------------------------------------------
    97. F000:4EF0                 jmp     short loc_F4EEF ; Jump
    98. F000:4EF2 ; ---------------------------------------------------------------------------
    Он играет ключевую роль.Опять этот HLT!! Причем данный кусок кода появляется в самом начале. Не понимаю..
     
  4. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Вот тут тоже вроде чуваки замарачиваются по теме: http://forums.mydigitallife.info/threads/22076-Latitude-D610-request-fix-for-137GB-BIOS-limit и вроде-бы даже чего-то там у них получилось в конце концов, хотя и с небольшими косячками в плане ethernet ;)
     
  5. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Дык это я и называю глынды через ж.., читал. Автор темы как раз вопрошал кто возьмется за disasm, иначе проблему не решить, т.к. чипсет один, но разное наполнение у этих буков :)
    Здесьhttp://forums.mydigitallife.info/threads/12962-Dell-bios-how-to-decompose-mod./page52 и далее я даже пытался вопрошать, но ответов не получил.

    Добавление: но самый главный вопрос, который я не в состоянии понять это команда
    Код (Text):
    1. F000:4FF8                 lidt    fword ptr cs:byte_F48EC ; Lidt=000000000400h
    2. F000:4FF8                                         ; adress base:00000000h
    3. F000:4FF8                                         ; limit:0400h
    4. F000:4FFF                 xor     esp, esp        ; esp=0
    5. F000:5002                 mov     eax, cr0        ; Move to/from Special Registers
    6. F000:5005                 and     al, 0FEh        ; Logical AND
    7. F000:5007                 mov     cr0, eax        ; write into cr0 new value
    8. F000:5007                                         ; cr0=60000010 Processor
    9. F000:5007                                         ; work in Real mode aka R_Mod
    10. F000:500A                 jmp     far ptr unk_FFFA0 ; Jump to standstill
    11. F000:500A ; ---------------------------------------------------------------------------
    12. .....
    13. В WinHEXe по этому адресу
    14.  
    15. Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
    16.  
    17. 000FFFA0   FF FF FF FF FF FF FF FF  FF FF FF FF FF FF FF FF   яяяяяяяяяяяяяяяя
    jmp far ptr unk_FFFA0. Куда передается управление? Сам бинарный код команды jmp выглядит так:
    Код (Text):
    1. Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
    2.  
    3. 000F5000                                  EA A0 FF 00 F0                ê ÿ ð
    Очевидно, что этот адрес не из БИОС либо ИДА врет, хотя врет она крайне редко. Такую конструкцию встретил еще в нескольких 0.5-1 Мб Биосах Делл. :dntknw:
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    и т.д. Точно не уверен, но скорее всего это переход в режим адресации всей памяти(flat memory).
    jmp не выполняется, а просто попадаем на следующую команду уже в этом режиме.
     
  7. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    есть вариант установить линуксовский биос. в поиске поиши(coreboot) вроде.
    если чипсет поддерживается, то можно и попробовать. все легче чем пол биоса разберать. с другой стороны есть утилиты позволяющие выташить биос и разбить его на модули. тогда будет возможност заменить модуль на новый и собрать обратно.
     
  8. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Спасибо посмотрю, о результате отпишу!

    Линуксовский биос останется как ласт хоуп, т.е. последняя надежда. Прога которая разбирает DELL BIOS на модули у меня есть. Я все три биоса (510,610,810)разбирал, сравнивал по-модульно. Но как оказалось -не все так просто. Адресация в каждом БИОСЕ своя кроме того различия есть в железе. Самое минимальное отличие по железу-между D610 и D810: у первого встроенная графика у второго видеокарта, но у D810 еще куча дополнительных модулей в БИОСе и он (БИОС) самый свежий. Поэтому я выбрал такой алгоритм действий:
    1. Разбираю бут блок смотрю базовую адресацию всех регистров
    2. Пишу малюсенький код , который активирует FIS регистр и вставляю в БИОС как ISA или ROM модуль. Это в идеале, реальность как всегда можеть быть совсем другой.
    Разбор бут блока пока особых трудностей не доставляет кроме тех вопросов что я задавал в начале поста.
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    http://e-zine.excode.ru/online/2/code_safe_mode.html
    Код (Text):
    1.  mov eax, cr0 ; Считываем значение CR0
    2.  and  al, 0feh  ; Сбрасваем нулевой бит в 0
    3.  mov cr0, eax ; Переходим в реальный режим
    Тут как раз про lidt спрашивают.
    http://forum.sources.ru/index.php?showtopic=298282

    Код (Text):
    1. Setup_RM:                                                                      
    2.    mov         AX, SYS_REAL_DS                                                
    3.    mov         DS, AX                                                        
    4.    mov         ES, AX                                                        
    5.    mov         SS, AX                                                        
    6.  
    7.    mov         EAX, cr0
    8.    and         AL, 0FEh
    9.    mov         cr0, EAX
    10.  
    11.    jmp         0:Enter_RM
    12. ;    DB         0EAh      
    13. ;    DW         Enter_RM  
    14. ;    DW         0        
    15.  
    16. Enter_RM:                
    17.    mov         AX, CS    
    18.    mov         DS, AX
    Но судя по расшифровке jmp - у тебя переход в F000:FFA0 но вот как работает сегмент в реал-режиме? Надо читать и разбираться
     
  10. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    valterg
    Не работает. Приходим к "Stop maschine" в результате.

    Хороший ресурс пойду почитаю. Спасибо за наводку!
     
  11. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Позволю себе несколько hints by Captain Obvious:

    Код (Text):
    1. lidt    fword ptr cs:byte_F48EC
    Это загрузка (инициализация) дескриптора прерываний. Ранее должен быть подготовлен этот самый дескриптор - сколько прерываний - и дескриптор на каждое из них. Возможно также перепрограммирование контроллера прерываний - установка таблицы векторов не с адреса 0000:0000.

    Код (Text):
    1. jmp     far ptr unk_FFFA0. Куда передается управление?
    После того как подготовлено все для перехода в режим ProtectedMode (а именно в этом месте вы сейчас и смотрите) процессор воспринимает команды jmp/call far или iret иначе - сегментный адрес это уже не сегмент (как в RealMode), а индекс в таблице GDT. Смотрите как (выше) инициализирована GDT - находите соответствующий дескриптор (должен быть CODE) и уже относительно базы этого дескра отщитывете указанное смещение в команде.

    Рекомендация: возьмите пример какой-нибудь простой демо-проги переводящей проц в PM - станет гораздо проще :)
     
  12. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    ++

    По поводу первого вопроса.

    Очевидно ключевыми являются все последние команды записи в порты (out) непосредственно перед HLT. HLT и цыкл служит для гарантированного замораживания кода до получения управления неким обработчегом.

    Что это может быть за обработчег? Действительно есть смысл смотреть какие обработчики прерываний уже инициализированы (особенно непосредственно перед OUT'ами). Я сомневаюсь что это NMI, больше похоже на SMM, хотя в 93' его еще не было (?). Если это действительно SMM, то его в дампе вообще нет - его нужно дампить отдельно.

    Смотреть описание чипсету - для чего нужны эти порты. Смотреть через весь код (особенно на обработчики прерывания) которые извлекают адрес прерыванной команды и пытаются чекать hlt+jmp и скипают их (если находят).
     
  13. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    PSR1257II
    Елки, все-таки прерывания. Такая мысля у меня висела в подсознании с самого начала. Но этот вопрос для меня самый трудный для понимания. Просветления пока нету.

    Дополнение: код БИОС DELL D4700 (Intel 915G), таже конструкция:
    Код (Text):
    1. F000:9303 ; ---------------------------------------------------------------------------
    2. F000:9303
    3. F000:9303 loc_79303:                              ; CODE XREF: F000:92DCj
    4. F000:9303                                         ; F000:92F5j
    5. F000:9303                 add     bp, 8           ; Add
    6. F000:9306                 cmp     bp, 92A2h       ;  Сравниваем
    7. F000:930A                 jb      short loc_792C5 ; если меньше то Jump  на вычисление
    8.                                                              ; нового значения bp
    9. F000:930C                 xor     esp, esp        ; esp=00000000h;
    10. F000:930F                 jmp     far ptr 0F000h:0FFA0h ; Jump
    11. F000:9314 ; ---------------------------------------------------------------------------
    12. ....
    В этом коде все немного проще но и там и там конструкция jmp far ptr 0F000h:0FFA0h ключевая для определения ветвления БИОС.

    Дополнение2:
    Это самое начало кода, после CLI, установки пары регистров в ICH и MCH, типа PCI I/O-enable и HIMEM-enable.Проц в реальном режиме и никуда не собирается переключаться, где он переключается я нашел, но это после выполнения этого JUMP. Почему в D810 загружается таблица прерываний не пойму, она и так по умолчанию по этому адресу сидит. Значение 48 битное слово -0000000400h
    Код (Text):
    1. Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
    2.  
    3. 000F48E0                                        00 04 00 00                  
    4. 000F48F0   00 00
     
  14. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Упс, я слегка прогнал - это не переход в PM а наоборот переход из PM в RealMode:

    Код (Text):
    1. F000:4FF8                 lidt    fword ptr cs:byte_F48EC ; Lidt=000000000400h
    2. F000:4FF8                                         ; adress base:00000000h
    3. F000:4FF8                                         ; limit:0400h
    Дескриптор таблицы прерываний указывает на сейчас на базу 0h (те физический! адрес с 0) - именно так как в RealMode/после сброса процессора и размер таблицы как раз соответствует 100h прерываниям: 100h*4=400h (4 байта на каждое прерывание).

    Это как раз СБРОС PE-бита. Те после этого машина будет работать в RealMode. Сорри.

    Код (Text):
    1. F000:500A                 jmp     far ptr unk_FFFA0 ; Jump to standstill
    Это переход на адрес f000:ffa0. Просто откройте этот адрес в IDA - я не знаю чего она тупит и не показывает это автоматом. Т.е если

    Сейчас вы тут, то после этого джампа вы уже тут:

    WinHex'ом смотреть память слегка наивно - нужно сделать загрузочную дискету/win98/etc и сразу после перехода в "DOS" дампить всю память (например с адресов C0000 до FFFFF).
     
  15. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Дык я ж уже писАл, что
    А память к этому моменту еще не инициализирована, т.е. ее как бы вообще не существует.
    Мы то знаем что она есть а проц и чипсет об этом еще не догадываются. Поэтому у меня такая гипотеза:
    Когда БИОС определил, что
    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):
    1. F000:4FE2 ; ---------------------------------------------------------------------------
    2. F000:4FE2
    3. F000:4FE2 eShn:                                   ; CODE XREF: F000:429Fj
    4. F000:4FE2                 mov     sp, 4FE8h
    5. F000:4FE5                 jmp     HB_PAM0_SET2    ; Jump
    6. ...
    7. F000:5E9C ; ---------------------------------------------------------------------------
    8. F000:5E9C
    9. F000:5E9C HB_PAM0_SET2:                           ; CODE XREF: F000:4FE5j
    10. F000:5E9C                 mov     dx, 0CF8h
    11. F000:5E9F                 mov     eax, 80000090h
    12. F000:5EA5                 out     dx, eax         ; Dev.0,Func.0, reg offset 90-93
    13. F000:5EA5                                         ; Host Bridge Program. Atribute Map 0
    14. F000:5EA5                                         ; 0F0000-0FFFFF Attribute (HIENABLE):
    15. F000:5EA5                                         ; This field controls the steering of
    16. F000:5EA5                                         ; read and write cycles that address
    17. F000:5EA5                                         ; the BIOS area from 0F0000 to 0FFFFF.
    18. F000:5EA7                 mov     dl, 0FCh ; '¹'
    19. F000:5EA9                 mov     al, 10h
    20. F000:5EAB                 out     dx, al          ; write reg.offset 90-93 (HIEnable)
    21. F000:5EAB                                         ; new value al=00010000b
    22. F000:5EAB                                         ; bits(5:4)=01,= Read only
    23. F000:5EAB                                         ; all read from DRAM
    24. F000:5EAB                                         ; all writes to DMI
    25. F000:5EAC                 jmp     sp              ; sp=4FE8
    26. F000:5EAC ; ---------------------------------------------------------------------------
    27. ....
    28. F000:4FE8 ; ---------------------------------------------------------------------------
    29. F000:4FE8
    30. F000:4FE8 loc_F4FE8:                              ; CODE XREF: F000:HB_PAM0_SET2j
    31. F000:4FE8                                         ; F000:5EACJ
    32. F000:4FE8                 mov     al, 0E2h ; 'ò'
    33. F000:4FEA                 out     70h, al         ; CMOS Memory:
    34. F000:4FEA                                         ; NMI disable, reg.offset 62?
    35. F000:4FEA                                         ;
    36. F000:4FEC                 in      al, 71h         ; CMOS Memory, read reg.value
    37. F000:4FEC                                         ; al=xx
    38. F000:4FEE                 mov     dh, al          ; dl=xx
    39. F000:4FF0                 mov     al, 0E3h ; 'ó'
    40. F000:4FF2                 out     70h, al         ; CMOS Memory:
    41. F000:4FF2                                         ; NMI disable, reg.offset 63?
    42. F000:4FF2                                         ;
    43. F000:4FF4                 in      al, 71h         ; CMOS Memory, read reg.value
    44. F000:4FF6                 mov     dl, al          ; In reg have value dx=[62]:[63]
    45. F000:4FF6                                         ; =xxxxh,CMOS offsets
    46. F000:4FF8                 db      66h
    47. F000:4FF8                 lidt    fword ptr cs:byte_F48EC ; Lidt=000000000400h
    48. F000:4FF8                                         ; adress base:00000000h
    49. F000:4FF8                                         ; limit:0400h
    50. F000:4FFF                 xor     esp, esp        ; esp=0
    51. F000:5002                 mov     eax, cr0        ; read cr0
    52. F000:5005                 and     al, 0FEh        ; write 0 to bit 0
    53. F000:5007                 mov     cr0, eax        ; write into cr0 new value
    54. F000:5007                                         ; cr0=60000010 Processor
    55. F000:5007                                         ; bits(30:29) CD = 1 NW=1
    56. F000:5007                                         ; "Strict memory ordering is not
    57. F000:5007                                         ; enforced unless the MTRRs are
    58. F000:5007                                         ; disabled and/or all memory is
    59. F000:5007                                         ; referenced as uncached"
    60. F000:5007                                         ; work in Real mode aka R_Mod
    61. F000:500A                 jmp     far ptr unk_FFFA0 ; jump where?? bin: EA A0 FF 00 F0
    62. F000:500A ; ---------------------------------------------------------------------------
    шаг 4) Переход по адресу.Может этот переход быть адресацией какого либо устройства? Ведь адрес FFFA0 должен быть из DRAM которой нет! Может этим устройством быть контроллер 8051? В нем есть память, регистры, зашитый в него код? Ведь dx=[62]:[63]=xxxxh должно быть как-то использовано.
     
  16. Tronix

    Tronix Member

    Публикаций:
    0
    Регистрация:
    10 сен 2010
    Сообщения:
    122
    Честно говоря я вообще не понимаю, зачем вы разбираете инициализацию? Надо имхо смотреть где происходит детект HDD. На все остальное можно положить..
     
  17. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    aascut

    Может быть но я сильно сомневаюсь. Может быть можно закрыть память через специфичные функции чипсета. Но имхо врядли.

    Вот инфа из Wiki:

    Так что ваш адрес F000:FFA0 is well below that initial address! (F000:FFF0). Просто откройте в IDA это смещение (F000:FFA0) - что там? Если там вменяемый код - то все логично.

    Ту прогу что вы привели выше - это больше похоже на какую-то инициализацию чипсета (порт CF8h-CFCh) и далее просто запрет (или разрешение) NMI и переход в RealMode. С большой вероятностью это один из тестов (или инициализация) который требует PM. Например подсчет размера памяти или ее тест.

    В принципе вы правы. Но интересно же :)
     
  18. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    ++

    Если вы пытаетесь читать эту память из винды - то да, действительно эта память может быть УЖЕ закрыта (линия A20 или что-то в этом роде). Читать нужно "из DOS". Ваш модуль в IDA - вы что его, WinHex'ом получили что-ли?!?
     
  19. aascut

    aascut New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2011
    Сообщения:
    30
    Tronix
    Еслиб я знал, где.. Возможно произошло недопонимание. Я просто взял хххххх.ROM
    из проги обновления БИОСА для другого бука,открыл его в иде, создал сегмент 64 кб последних байт, поставил курсор на F000:FFF0 нажал кнопку С и понеслось..

    PSR1257II А чем можно сдампить память из ДОСа, в смысле прогу посоветуйте.
     
  20. PSR1257II

    PSR1257II New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2011
    Сообщения:
    228
    Да напишите сами простейшую - на ассемблере/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 и далее ищите в дизасме характерные константы или команды - для нескольких сегментов это не так-то много смотреть...