Помогите примером кода для загрузчика и MBR

Тема в разделе "WASM.OS.DEVEL", создана пользователем Antolflash, 4 ноя 2009.

  1. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Вообще в BIOS есть и такие функции, только они редко поддерживаются :~) Я имел в виду, что могли бы загрузочную цепочку организовать таким образом, чтобы хоть в MBR не пихать код работы с портами.
    Или boot manager уже не умещается в базовой памяти :-/
    Или уже настолько разленились, что boot manager - есть обычный модуль, требующий типичного окружения защищенного режима :-\
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Только не бут-сектор... Да, бут-блок может состоять из нескольких секторов. Примеры - FAT32, NTFS. код MBR загружает бут-сектор, а код бут-сектора догружает дополнительные секторы бут-блока. Нестандартный MBR-загрузчик также может иметь подобную структуру, т.к. после MBR на диске практически всегда присутствуют еще 62 редко используемых сектора (там как раз-таки чаще всего и хранятся фрагменты бут-менеджеров, установленных на твоем компьютере вирусов, ну и еще иногда GPT).
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это нормально, если твоя MBR способна загружать и обычные бут-секторы обычных разделов, т.е. если она остается в общем случае ОС-независимой, но имеет расширенные возможности, используемые для загрузки твоей ОС. Я к примеру тоже обычно использую свой MBR-загрузчик, который в состоянии работать обычным образом, но позволяет передать загрузчику тома для моей ОС дополнительный параметр. В принципе ОС способна загружаться и с обычным MBR, но в этом случае возможности по ее загрузки из различных источников сокращаются.
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Phantom_84
    Да, в Висле и Семёрке MBR переделан. Висловский я раньше дизасмил для интереса; он не сохранился, но, насколько помню, полностью аналогичен этому -- с разрешением линии A20 и с поддержкой TPM (причём последняя точно была: запомнил, потому что пришлось гуглить, что это за прерывание такое непонятное).

    Надо будет для интереса посмотреть ещё загрузчик раздела NTFS у Семёрки...
     
  5. nikto

    nikto New Member

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

    хочу сделать чтобы при загрузке система вывила скрипичный ключ (0D) и ожидала нажатия клавиши. что я делаю: запустил debug.exe, считал с помощью int13 нулевой сектор жесткого диска, изменил начиная с первого байта(!) считанный сектор записав туда команды:
    mov ax,0b800h
    mov es,ax
    mov es:[0000],310Dh
    mov ah,0
    int 16h
    ну и этим же int13h записал измененный сектор на место старого. перезагрузил. и ничего не вывило. так вот че я делаю не так?я прочел конечно все что тут было написано, и все как я понял записывают bin файлом, а так как я делаю неполучится чтоли? заранее спасибо.
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Ну, если активна нулевая страница видеопамяти, то символ должен вывестись, по идее... Но что будет делаться после нажатия клавиши? Кода-то нет, далее пойдёт какой-то мусор, и к чему это приведёт, никто не знает.
     
  7. nikto

    nikto New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    12
    так вот именно что ни че и не вывелось.просто черный экран и все. естественно ctr alt del только потом помогает. под активной нулевой страницей видеопамяти что имеешь ввиду? а то что будет даль после нажатия клавиши не важно. пока не важно. я все лишь учусь. я подумал может не с камого первого быйта надо было вставлять мой код. там первыми были команды:
    xor ax, ax
    mov ss, ax
    mov sp, 7C00h
    sti
    решил после них вставить свой код. но всеровно ничего. я вот о чем хотел поинтересоваться. как записать bin файл то? ну скажем создал я свой код в tasm'е, сохранил в asm файл. а дальше че? как в bin его? ключами какимито чтоли? и как потом это bin файл в загрузочный сектор записать?
     
  8. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    Может это не совсем то, что интересует ТС. Писал давно из интереса, когда начинал изучать asm. Код конечно отстойный, но тогда интересовала только возможность написать что-либо работающее и как можно быстрее =)
    Вобщем простенький менеджер загрузки - выводит менюшку(код менюшки брал из книжки Питера Абеля) с четырмя пунктами, представляющими из себя четыре возможных первичных раздела, соответственно грузить умеет только загрузочные сектора первичных разделов, сектора читает в режиме LBA.

    Как пользоваться:
    1. Форматируем(берем готовую) дискетку с dos
    2. Записываем на нее bmmbr.bin, selmu.bin, install.com
    3. Грузимся с нее и запускаем install.com
    4. Дальше вроде должно быть понятно
    либо: открываем диск в дисковом редакторе и записываем bmmbr.bin в начало mbr, а selmu.bin в начиная с 3го сектора диска.
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Экстремально. Не пробовал использовать эмулятор. Да и потом для таких экспериментов не обязательно править именно MBR. Можешь к примеру сохранить образ первичного дискового загрузчика тома (раздела) сохранить в виде файла и загрузить его ntldr'ом, предварительнно подправив boot.ini (см. описание параметров boot.ini в сети).

     
  10. nikto

    nikto New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    12
    Phantom_84 экстремально говоришь. если бы я знал в чем заключается экстрим, может быть я бы так и не делал. скажи пожалуйста что может произойти? я думаю ну считал BIOS первый сектор в память, ну передал ему управление, а там мой код. ну может мой код не совсем корректный, но все же не мусор всякий. ну не пошло ни че дальше.и все на этом... или могут наступить какието серьезные последствия? эмулятор конечно было бы хорошо пожалуй. но я не имею понятия как им пользоваться и как он вообще выглядит. ну конечно можно поискать как им пользоваться, но может кто нибудь поможет начинающему и опишет хотябы в двух, ну может в трех словах про эти эмуляторы ). спасибо заренее. большооое спасибо.
     
  11. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    Ассемблируешь и линкуешь как com-файл (в масмовском линкере ключ /tiny), в загрузочный сектор можно записать при помощи дискового редактора (например, diskprobe или acronis disk editor).
    Когда с этим экспериментировал, делал так: создал две виртуальные машины, в одной из них открыл загрузочный сектор диска другой машины в дисковом редакторе и сохранял в нем изменения, потом запускал первую машину и смотрел, что получилось. Может это конечно профанский подход, но тем не менее написать менеджер загрузки таким способом получилось..
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    dmsdm
    Все современные версии масма не поддерживают создание ком-файлов. Надо либо искать старую версию, либо брать сторонний компоновщик (я, например, использую UniLink).
     
  13. dmsdm

    dmsdm New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2007
    Сообщения:
    28
    ага, забыл об этом написать.. сам использую мсовский 16-битный линкер: hччp://download.microsoft.com/download/vc15/Update/1/WIN98/EN-US/Lnk563.exe
     
  14. nikto

    nikto New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    12
    попробовал написать MBR. только он не запускает ОС почемуто. гляньте, может ошибку в коде подскажетe.
    сообщения об ошибках, таблицу разделов и 6 байт перед таблицей разделов я старые оставил. изменил только сам код вставив туда свой. остальные байты старого кода заменил нулями до сообщений об ошибках. записывал в ДОСе командой int 13. запустил 'debug.exe mbr.com', где mbr.com есть мой mbr.asm(написан на fasm'e ). сначало считал MBR, заменил код на свой, затем записал обратно. да, и проверку на 55АА вторичного загрузчика я убрал. подумал может изза проверки не грузиться. но всетаки так и ниче не загрузилось. при загрузке вывело сообщение 'Operation system no found', хотя такого сообщения в MBR вообще нет. а можно как нибудь отследить работу этого загрузчика построчно?


    Код (Text):
    1.  
    2.     use16
    3.     org 7c00h
    4.  
    5.     cli           ;
    6.     xor ax,ax     ;
    7.     mov ss,ax     ;
    8.     mov sp,7c00h  ;
    9.     sti           ;
    10.  
    11.     cld           ;
    12.     mov es,ax     ;
    13.     mov ds,ax     ;
    14.     mov si,7c00h  ;
    15.     mov di,0600h  ;
    16.     mov cx,200h   ;
    17.     rep movsb     ;
    18.  
    19.     push ax           ;
    20.     mov ax,$+8-7c00h  ;
    21.     add ax,0600h      ;
    22.     push ax           ;
    23.     retf              ;
    24.  
    25.     mov bp,6BEh
    26.     mov cx,4h         ;
    27.  
    28. FindActive:
    29.  
    30.     cmp [bp+0],ch         ;
    31.     jl Active             ;
    32.                           ;
    33.     jnz InvalidPartTable  ;
    34.  
    35.     add bp,10h            ;
    36.     loop FindActive       ;
    37.     int 18h               ;
    38.                           ;
    39.  
    40.  
    41. Active:
    42.     mov al,[bp+4] ;
    43.  
    44.     cmp al,07h
    45.     je  m1
    46.     jmp InvalidPartTable
    47.  
    48.  m1:
    49.     mov ax,0201h
    50.  
    51.  
    52.     mov dh,[bp+01]
    53.  
    54.     mov cl,[bp+02]
    55.     mov ch,[bp+03]
    56.     mov bx,7c00h
    57.     int 13h
    58.     jc ErrorLoadOS
    59.  
    60.    ;      <- здесь проверка была на 55AA.
    61.     jmp startOS
    62.  
    63.  
    64. MissOperSystem:
    65.     cld
    66.     mov al,byte ptr ds:07b7h
    67.  
    68.     mov ah,7
    69.     mov si,ax
    70.  
    71.  meseg_4:
    72.     lodsb
    73.     cmp al,0
    74.  
    75.     jne meseg_5
    76.     jmp $
    77.  
    78.  meseg_5:
    79.     mov ah,0eh
    80.     mov bx,7
    81.     int 10h
    82.     jmp meseg_4
    83.  
    84. ErrorLoadOS:
    85.     cld
    86.     mov al,byte ptr ds:07b6h
    87.  
    88.     mov ah,7
    89.     mov si,ax
    90.  
    91.  meseg_2:
    92.     lodsb
    93.     cmp al,0
    94.  
    95.     jne meseg_3
    96.     jmp $
    97.  
    98.  meseg_3:
    99.     mov ah,0eh
    100.     mov bx,7
    101.     int 10h             ;
    102.     jmp meseg_2         ;
    103.  
    104. InvalidPartTable:
    105.     cld
    106.     mov al,byte ptr ds:07b5h
    107.  
    108.     mov ah,7
    109.     mov si,ax
    110.  
    111.  meseg:
    112.     lodsb
    113.     cmp al,0
    114.  
    115.     jne meseg_1
    116.     jmp $
    117.  
    118.  meseg_1:
    119.     mov ah,0eh
    120.     mov bx,7
    121.     int 10h             ;
    122.     jmp meseg           ;
    123.  
    124. ;-------------------------------------------------------------------------------------
    125.  
    126.  startOS:
    127.     mov ax,7c00h
    128.     mov bx,0000
    129.     push ax       ;
    130.     push bx       ;
    131.     retf          ;
     
  15. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    239
    nikto
    Я думаю что нужно org 600h
    ибо коду который до retf выполняется все равно какое смещение - там меток нет, за исключением вот этого:
    непонятно зачем это. MBR явно от винды откручен, а там следующее
    Так вот далее идут метки к которым fasm прибавляет 7C00h, но код то уже выполняется в 0000:0600h, то есть добавляться должно 600h, а не 7C00h
    Дальше не смотрел
     
  16. nikto

    nikto New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    12
    mov ax,$+8-7c00h ;
    непонятно зачем это.

    это ерунда. я поменяю потом. просто надо было чтоб после этого

    mov ax,$+8-7c00h ;
    add ax,0600h ;
    push ax ;
    retf
    в стеке был адрес следующей команды. вообщем извращенство мое.

    я смотрел какой МБР у меня в XP и основываясь на этот код писал свой. это если мягко говорить. ну а если грубо, то это почти тот же самый код что и в XP, только урезаный немного.
    точно точно. скорее всего деле в org 7c00.

    я вот чето немного не пойму. некто SII выкладывал MBR win 7. так вот там есть строка проверки сигнатуры вторичного загрузчика.
    cmp ds:Signature, 0AA55h
    что это - Signature ? это есть это dd 2B11BF10h. или нет?
     
  17. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    239
    Signature убирай нафиг ставь 7DFEh
    Signature - метка для 55AAh
    ds:Signature будет нормально работать при org 7C00h
    к этой проверке туда уже считан (но мб не считался загрузчик)
    то есть если ставить org 0600h то ds:Signature будет другим адресом (0000:07FEh), то MBR будет проверять свою сигнатуру по новому адресу и будет считать, что boot sector загружен, хотя проверил сам себя(у MBR тоже в конце 55AAh проверяемая BIOS ом), а там возможно ничего нету
    надеюсь понятно написал...
     
  18. nikto

    nikto New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    12
    да. доступно объяснил. спасибо Treant.
     
  19. nikto

    nikto New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    12
    org 600h и ошибся надо было 7BE вместо 6BE