Partition table как правильно написать CHS ?

Тема в разделе "WASM.OS.DEVEL", создана пользователем abcd008, 8 янв 2011.

  1. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Phantom_84
    вот именно что они mbr всегда заменяют. а это плохо. может тебе нужен продвинутый, а они на свой обычный. А ты потом ищи старый сектор? темболее если mbr больше 1 сектора занимает.

    я согласен смириться с disk signature полем, но это если оно уже есть, а если винда не установлена, что туда писать надо. я читал что linux 2,6 тоже использует это поле для идентификации диска. но что будет если при установке винды она его исправит на свое? тогда линух потеряет диск, и будет опять писать туда свой di. при следующей загрузке винда ненайдет свой id, и так до бесконечности? Или может есть какой алгоритм для этого поля?
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это поле меняется только при установке. Если Windows увидит, что это поле изменилось, она просто повторно запустит идентификацию разделов на диске и запомнит новое значение этого поля. Максимум, чем ты рискуешь, так это изменением имен логических дисков, причем системный том должен сохранить свое имя. У тебя могла возникнуть ошибка из-за того, что это поле стало не просто другое, а перестало быть корректным. Как генерировать корректные значения для этого поля, я не знаю. Мои установщики его не трогают. Я использую динамическое определение загрузочного диска и раздела. Штатно их может подменить только MBR-загрузчик (stage 0) или вторичный загрузчик (stage 2).
     
  3. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я думаю проще идентифицировать диски по их серийному номеру.
     
  4. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Логические диски? В смысле тома? Я вообще предпочитаю "географическую" привязку, несмотря на то что она не гарантирует соответствие имен разделов и данных, которые на них хранятся, зато более понятна для пользователя. А вообще в моей системе можно именовать разделы и физические диски произвольно - по гуидам, по "географическому" принципу или еще как-нибудь, и хотя загрузочный раздел определяется по его порядковому номеру (кстати порядковый номер необязательно должен соответствовать "географическому" местоположению, просто сейчас MBR-загрузчик и менеджер томов используют "географическую" нумерацию - между ними должно быть соответствие или они должны обеспечивать такое соответствие - это касается и вторичного загрузчика, но он сейчас не используется), но уже монтирование ФС на нем происходит по его имени. Надеюсь, я понятно излагаю.
     
  5. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    не совсем. что за географически, как в линукс (hd1,2)?
     
  6. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да, только это похоже на GRUB. В линуксе как-то так: hda1 и т.п. Хотя суть одна. Я по началу вообще 16-ричную нумерацию разделов в именах использовал: hda#01 и т.п. :) Сейчас именую диски (разделы) также, как это делается в линуксе.
     
  7. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    в линуксе она и вроде и есть шестнадцатиричная, то есть hda1-hdzFF? или там вместо ff 255.
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Насчет 255 точно не скажу, но вообще нумерация десятичная. У меня до 255 включительно. Хотя я не тестировал на реальном железе. Делал образ с одним-четырьмя расширенными разделами, в которых по-разному распределял в том числе 251 и 252 вложенных раздела. 252-ой вложенный раздел менеджер томов уже не обрабатывает.
     
  9. abcd008

    abcd008 New Member

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

    слушай а если я буду править CHS под другую геометрию, мнеж придется тогда и все BPB править.
    Правильно? а BPB во всех типах разделов есть? или только в fat ntfs.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Для тестирования я делал образ с разделами, но без файловых систем. Если тебе нужна ФС на разделе в образе, можешь разметить/отформатировать этот раздел уже после подключения средствами той ОС (или другого софта), которую загружаешь в эмуляторе. Я обычно в эмуляторе использую загрузочные образ флоппика или ISO-образ, а жесткие диски подключаю физические. А загрузку с жесткого диска эмулирую, фактически загружаясь с физического флоппика или CD/DVD, путем совмещения в памяти тестируемого загрузчика и данных с физического жесткого диска. Единственное, что мне нужно на реальном жестком диске при тестировании, так это раздел с FAT (с другими ФС я пока работать не умею), содержащий предварительно скопированные в него файлы ОС. Если тестируемый загрузчик использует самодозагрузку, то по возможности записываю и догружаемые блоки на диск. Когда такой возможности, снимаю образ с существующего диска и правлю его или же не пользуюсь эмуляцией вообще. До того, чтобы делать законченные образы жесткого диска (с разделами, на которых есть ОС с файлами), я еще не дошел. Практикую такое только для образа флоппика и ISO-образа. Основная проблема в том, что на диске может быть множество разделов с совершенно различными ФС. В принципе можно собирать образ поэтапно - сначала разделы, а потом объединять их вместе, добавляя нулевой цилиндр. Или же использовать включаемые файлы, где каждый файл описывал бы отдельный раздел со своей линейной адресацией. Вообще мне эта тема интересна. У меня собираются загрузочные образы floppy, cdrom и disk, но последний крайне примитивный - в нем помимо данных нулевой дорожки под нулевой головкой находится один раздел, в котором вместо первичного загрузчика стоит заглушка, выдающая инфу, полученную от MBR-загрузчика - больше ничего в разделе нет. Т.е. по сути образ disk может использоваться только для тестирования MBR-загрузчика и загружаемого им кода.

    Я не знаю, чтобы было где-нибудь еще, но не исключено. Ты в любом случае будешь вводить поддержку ФС, если собираешься сделать продвинутую программу. Если в поддерживаемых ФС нужно прописывать трехмерную геометрию/координаты, будешь это делать. А в неподдерживаемых естественно не будешь.
     
  11. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    я думаю bpb должен быть везде. это же блок данных биос. на флопике точно всегда есть, иначе как узнать формат диска.
    ладно спасибо, начал писать вторую версию mbr с поддержкой CHS.
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Несмотря на свое название, к BIOS эта структура никакого отношения не имеет.
     
  13. abcd008

    abcd008 New Member

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

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    посмотри я правило сделал перевод LBA в CHS:

    mov di,dx ; сохраняем номер диска
    mov ah,8 ; читаем параметры диска
    int 13h ; cx-максимальный номер сектора и старшие биты цилиндра
    test ah,ah ; dx-максимальный номер головки

    jnz short erros ; если ошибка вывести сообщение

    xor ebx,ebx ;подготовка регистров
    and ecx,111111b ;оставляем только номер сектора
    mov dl,dh ;
    and edx,0ffh ;здесь только номер головки

    ;формулы для преобразования LBA в CHS
    ;С=N/(H_MAX*S_MAX)
    ;H=(N-C*H_MAX*S_MAX)/S_MAX
    ;S=N-(C*H_MAX+H)*S_MAX+1
    ;где N- LBA адрес

    mov ax,dx ; вычисляем H_MAX*S_MAX
    mul cx
    mov bx,ax

    mov eax,[si+8] ; LBA
    div ebx ; вычисляем цилиндр N/(H_MAX*S_MAX)

    push eax ;сохраняем его

    mul ebx ;C*H_MAX*S_MAX
    mov ebx,eax
    mov eax,[si+8] ;LBA
    sub eax,ebx ;N-C*H_MAX*S_MAX
    div ecx ;(N-C*H_MAX*S_MAX)/S_MAX

    push eax ;сохраняем головку

    xchg eax,ebx ;вычисляем сектор
    div ecx ;
    add eax,ebx ;C*H_MAX+H
    mul ecx ;(C*H_MAX+H)*S_MAX
    mov ebx,[si+8] ;
    sub ebx,eax ;N-(C*H_MAX+H)*S_MAX
    inc ebx ;N-(C*H_MAX+H)*S_MAX+1

    pop eax ;головка
    pop ecx ;цилиндр

    rol cx,8 ;загружаем регистры
    shl cl,6
    and bl,11000000b;
    or cl,bl ;
    mov dx,di ;восстанавливаем номер диска
    mov dh,ah ;
    mov ax,0201h ;
    mov bx,7c00h ;
    int 13h ;
     
  15. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    интересно мой биос не поддерживает int 13h (ah=8)
    все время ошибка либо 7, либо 8.
    походу он эту функцию только для флоппи поддерживает.
    получается для новых компов можно не заморачиваться с поддержкой старого сервиса биос.
    а геометрию считать как x 63 255.

    зря писал вторую версию mbr.
     
  16. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    нашел формулу попроще
    ■ С = int(LBA/SPT/HPC),
    ■ Н = int((LBA/SPT) mod HPC),
    ■ S = (LBA mod SPT)+ 1.

    только у меня деление всегда выдает ошибку переполнения
    div ecx почему?
     
  17. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Скорее всего определяет экспериментально, как все это делают. Может, учитывает идентификатор типа дисковода, который хранится в CMOS.

    Две из них создал один человек... Судя по всему, в ветке OSDev на wasm'е более серьезные темы еще не скоро начнут обсуждаться.

    С 32-разрядными регистрами проще... Я для совместимости в загрузчиках использую только набор инструкций i8086... В формулах использую целочисленное деление и остаток от деления. Формулы воссоздавать не буду - они элементарно выводятся из основной формулы преобразования CHS в LBA. Что касается кода, то даже при использовании 32-разрядных регистров остаток от "короткого" деления может быть максимум равным 255, чего явно недостаточно. Я использую специальную подпрограмму деления.
    Код (Text):
    1. ; это из alter'а - вообще регистры могут быть другие
    2. ; На входе: ax:cx - делимое, bp - делитель
    3. ; На выходе: ax:cx - частное, dx - остаток
    4. divide:
    5.         xor dx,dx
    6.         xchg ax,cx
    7.         div bp
    8.         xchg ax,cx
    9.         div bp
    10.         ret
    Ты неправ. Функция прекрасно работает в том числе часто и на больших дисках (естественно обрезая число цилиндров и часто еще резервируя один цилиндр). Просто нужно использовать правильный порядок работы, о котором я уже писал. Сначала пробуешь использовать EDD, если не получается, тогда уже устаревшие функции, включая функцию 8. К тому же, этот же MBR-загрузчик можно использовать и на флешках, а там и размеры пока поменьше и геометрии не совсем стандартные.
     
  18. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    блин у меня в книге забыли написать про dx:ax.
    тогда твою программу можно упростить
    вход dx:ax
    выход ax
    cx на что делим
    остаток dx

    div cx и все. я прав?
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Нет, частное не всегда умещается в 16 бит. А вот если ты продолжишь использовать 32-разрядные регистры, тогда по идее можно.

    Кстати, нашел у себя формулы:

    S = N mod SPT + 1
    T = N / SPT

    H = T mod Heads
    C = T / Heads
     
  20. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    Phantom_84
    у тебя процедура не правильно работает, там не надо еще xor dx,dx перед вторым делением поставить?