Несколько вопросов о bios

Discussion in 'WASM.BEGINNERS' started by stellaco, Mar 23, 2009.

  1. stellaco

    stellaco New Member

    Blog Posts:
    0
    Осваиваю 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)..


    Следующие вопросы добавлю чуть позже. Как только будут ответы на эти.
     
  2. jaja

    jaja New Member

    Blog Posts:
    0
    Попробуй FASM. Я многое понял, в том числе и bios благодаря нему.
     
  3. Pavia

    Pavia Well-Known Member

    Blog Posts:
    0
    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
     
  4. Pavia

    Pavia Well-Known Member

    Blog Posts:
    0
    Так и происходит Обыкновенный mov. Адресс выставляется на шине адресса контроллер памяти решает это ОЗУ или нет. Если нет то отпровляет дальше по линиям, если ОЗУ то соответственно заворачивает в нее.
     
  5. stellaco

    stellaco New Member

    Blog Posts:
    0
    Pavia
    Большое спасибо за ответ.


    Следующий вопрос, касается дизассемблирования .bin bios в ida.
    В книге написано следующие "Откройте 512-килобайтный файл в ida и установите начальный адрес загрузки в в 8_0000h-F_FFFFh. Затем создайте новые сегменты в диапазоне адресов FFF8_0000h - FFFD_FFFFh и переместите содержимое блока 8_0000h-F_FFFFh в только-что созданный сегмент"

    и дан код
    Code (Text):
    1. // Листинг 5.4. Сценарий IDA Pro для перемещения блока начальной загрузки Award BIOS
    2.              с целью имитации отображения кода BIOS на системное адресное пространство
    3.  
    4. auto ea, ea_src, ea_dest;
    5.  
    6. /* Создаем сегменты для двоичного файла, загруженного в данный момент. */
    7. for(ea = 0x80000; ea < 0x100000; ea = ea + 0x10000)
    8. {SegCreate(ea, ea + 0x10000, ea>>4, 0, 0, 0);}
    9.  
    10. /* Создаем новые сегменты для перемещения */
    11. for(ea = 0xFFF80000; ea < 0xFFFE0000; ea = ea + 0x10000)
    12. {SegCreate(ea, ea + 0x10000, ea>>4, 0, 0, 0);}
    13.  
    14. /* Перемещаем сегменты. */
    15. ea_src = 0x80000;
    16. for(ea_dest = 0xFFF80000; ea_dest < 0xFFFE0000; ea_dest = ea_dest + 4)
    17. {PatchDword(ea_dest, Dword(ea_src));
    18. ea_src = ea_src + 4;}
    19. /* Удаляем ненужные сегменты, чтобы имитировать системное пространство адресов. */
    20. for(ea = 0x80000; ea < 0xE0000; ea = ea + 0x10000)
    21. {SegDelete(ea, 1);}
    Возможно это глупый вопрос..но как установить начальный адрес загрузки в в 8_0000h-F_FFFFh в ida ??
     
  6. n0name

    n0name New Member

    Blog Posts:
    0
    Rebase program ?
     
  7. featurelles

    featurelles New Member

    Blog Posts:
    0
  8. stellaco

    stellaco New Member

    Blog Posts:
    0
    n0name
    Да, именно то..спасибо.

    Открыв бинарный файл BIOS и проделав некоторые манипуляции (запуск скрипта ida ..который перемещает сегменты).. должно получиться следующее(пример из книги)

    Code (Text):
    1. Листинг 5.5. Дизассемблированный код вспомогательной подпрограммы
    2.              для конфигурирования PCI
    3.  
    4. Адрес       Мнемонический код
    5. F000:F770 read_pci_byte proc near
    6. F000:F770   mov   ax, 8000h
    7. F000:F773   shl   eax, 10h
    8. F000:F777   mov   ax, cx
    9. F000:F779   and   al, 0FCh
    10. F000:F77B   mov   dx, 0CF8h ; dx = порт адреса конфигурационного
    11.                             ; пространства PCI
    12. F000:F77E   out   dx, eax
    13. F000:F780   add   dl, 4     ; dx = порт данных конфигурационного
    14.                             ; пространства PCI
    15. F000:F783   mov   al, cl
    16. F000:F785   and   al, 3
    17. F000:F787   add   dl, al
    18. F000:F789   in    al, dx    ; Читаем значения соответствующих регистров.
    19. F000:F78A   retn
    20. F000:F78A read_pci_byte endp
    21.  
    22. F000:F78C write_pci_byte proc near
    23. F000:F78C   xchg  ax, cx
    24. F000:F78D   shl   ecx, 10h
    25. F000:F791   xchg  ax, cx
    26. F000:F792   mov   ax, 8000h
    27. F000:F795   shl   eax, 10h
    28. F000:F799   mov   ax, cx
    29. F000:F79B   and   al, 0FCh
    30. F000:F79D   mov   dx, 0CF8h ; dx = порт адреса конфигурационного
    31.                             ; пространства PCI
    32. F000:F7A0   out   dx, eax
    33. F000:F7A2   add   dl, 4     ; dx = порт данных конфигурационного
    34.                             ; пространства PCI
    35. F000:F7A5   mov   al, cl
    36. F000:F7A7   and   al, 3
    37. F000:F7A9   add   dl, al
    38. F000:F7AB   mov   eax, ecx
    39. F000:F7AE   shr   eax, 10h
    40. F000:F7B2   out   dx, al    ; Записываем значение в регистр
    41. F000:F7B3   retn
    42. F000:F7B3 write_pci_byte endp
    У меня получается всё как на этой картинке (104 кб) http://s49.radikal.ru/i123/0904/6d/419b1720e2cb.jpg
    Вроде всё верно, сегменты созданы...данные перемещены. Дизасм код, пока отображается как данные.

    Захожу по адресу seg000:F77O жму кнопку C, данные переделываются в код...но точно не в такой как в книге F000:F770 mov ax, 8000h (Выходит я не туда смотрю.)
    Что я делаю не так?
     
  9. censored

    censored New Member

    Blog Posts:
    0
    stellaco дубль featurelles?
     
  10. stellaco

    stellaco New Member

    Blog Posts:
    0
    censored
    Нет.
    Хотя будь это так, то я бы всё равно отрицал.
     
  11. censored

    censored New Member

    Blog Posts:
    0
    Тогда почему оправдывается? =)
     
  12. stellaco

    stellaco New Member

    Blog Posts:
    0
    censored
    Образ мышления как у японца.
    Оправдывается, значит виновен =)
     
  13. stellaco

    stellaco New Member

    Blog Posts:
    0
    Последний мой вопрос отпадает...разобрался в чём дело =)