Снова про MBR: загрузка с USB/CD

Тема в разделе "WASM.NT.KERNEL", создана пользователем SunGod, 20 сен 2009.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    wingshaver
    Незакрыт просто приложение под админом надо запускать.
     
  2. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    P.S.

    Груб специально "инсталил" ручками, копируя загрузочный код в винхексе, так что он грузит и без "инсталла", я вот не уверен насчет фрагментации самого GRLDR, не знаю как он делает - потому что если в самом деле ориентировать на минимальный размер кластера в 512 байт, то туда опять таки явно не запихнут код для работы со всеми ФАТами, а если грузят больше - то будут падать в случае фрагментации. А кто-нибудь проверял этот случай? Ну, когда кластер 512 и ГРЛДР фрагментирован? Может он и не осилит?)

    wingshaver
    Интеррапты биоса рассчитаны на риал мод, из протектеда падать будут...
     
  3. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    Куча проверок идет потом, как правильно заметили (в том числе на код шатдауна). Первая инструкция у qemu - именно jmp far. В прошивке 1238 для P5B deluxe аналогично - EA AA FF 00 F0, т.е. jmp F000:FFAA.
    Есть сильное подозрение, что все же маппинг выполняется чипсетом.
     
  4. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
     
  5. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    А что тогда сидит под границей 4 гиг?
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Про CS и jmp far. Pinczakko пишет:
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Мы видимо о разных grub'ах говорим. В моей статье, ссылку на которую я дал, написано, что номер первого сектора stage2 хранится непосредственно в stage1 (его правильная установка выполняется именно в рамках инсталляционной процедуры), а не определяется из файловой записи корневого каталога, тем более что grub обычно находится не в корневом каталоге.

    По поводу far jump'а...
    Думаю, что на самом деле существуют разные вариации, хотя в конечном итоге результат один и тот же.
     
  8. Vic3Dexe

    Vic3Dexe New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2009
    Сообщения:
    53
    2reverser
    О, т.е. все-таки чипсет. Терь понятно, спасибо.

    2Phantom_84
    Упаковка скорее всего относится к этому самому рантайм, т.е. рутинам типа инт 13 и пр.

    2all
    Всем пасибо, разобрался.
     
  9. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Phantom_84

    Точно о разных, эту статью я раньше еще видел, увидел что прописан адрес явно - подумал "о, как просто", дизасмил мбр своей флешки - и не увидел ничего похожего.

    У меня наборчик виндовых утилит, Grub4Dos зовется, вот там как раз такой метод, что я описал.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да, я уже понял. Кстати, я вычитал, что GRUB4DOS тоже требует установочной процедуры... хотя возможно она затрагивает лишь размещение загрузчика в нужном месте без его правки. Мне не приходилось использовать GRLDR, а тем более изучать его работу. Не было такой необходимости.

    Не совсем понятен один момент. Как я понял, grldr.mbr как и stage1 может быть размещен и в MBR, и в начале раздела. Также я прочитал, что этот код сканирует все диски и разделы на наличие grldr, причем он поддерживает разные ФС (не только FAT'ы). Возможно ли такое в опять-таки весьма ограниченном по размеру коде?
     
  11. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Хм, ну я пока там видел код, который просто грузит по сектору, и ищет там строку
    "GRLDR ". Может быть в тех ФС что он поддерживает, этот метод тоже сработает?
     
  12. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Вообще говоря, можно сделать проще - в самом файле поставить нужное количество "меток"(каждый сектор пометить), и, сканируя носитель, просто "собрать" этот файл, независимо от того, как он был разбит.
    Костыль, конечно, зато мбр легко загрузит его почти в любой ситуации.
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Посмотрел grldr.mbr... Оказалось, что это не только образ MBR. Файл, который я скачал, занимает ровно 18 секторов и представляет собой последовательно соединенные MBR и дисковые загрузчики для разных ФС. Устанавливать или дизассемблировать не стал, поэтому непонятно, этот файл целиком пишется в начало харда (тогда не понятен столь странный формат и как ЭТО будет размещаться на других носителях) или это просто внешний файл для установочной программы, которая выбирает из него именно то, что нужно. В принципе, если бы я писал GRUB4DOS, а не китайцы, я бы сделал установку дискового загрузчика тома плюс для устройств, имеющих разделение на разделы, установку специфичного MBR, который делает все, что нужно, для дальнейшей загрузки дискового загрузчика тома. Собственно, именно такой вариант я и использую.
     
  14. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Чтоб уж не стартовать новую тему, еще вопросик сюда же подкину:
    Может кто знает как груб грузит образа? Я имею в виду что не может же он образ диска скопировать в память и джампнуть на его мбр - ведь этот МБР то будет юзать 13й интеррапт для того чтобы загрузиться, и прочие тому подобные неприятности произойдут.

    То есть по логике ГРУБ должен создать "виртуальный диск", а т.к. это все происходит сразу после отработки БИОСа, то я вижу только один путь - прописаться в интеррапты, то бишь заменить инт13 на свой...
    Он в самом деле так делает? Или биос предоставляет какой нибудь простой способ для создания RAM-диска?
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    grub не opensource?
     
  16. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Какие то обрывки исходов видел...

    Ну может кто уже разбирался, чтобы не копаться долго. Я не прошу весь код мне рассказать, мне сам принцип интересен - в самом ли деле на таком уровне это происходит.
     
  17. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    SunGod grub по-моему образы не грузит. Ты говоришь, наверное, про grub4dos. Для него тоже исходники есть, но вот с документацией похуже. Либо комментарии, либо его форумы.
    Судя по описаниям эмулит образы он только в ДОС-режиме.
     
  18. SunGod

    SunGod New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2009
    Сообщения:
    23
    Да, я про Grub4DOS.
    >эмулит образы он только в ДОС-режиме
    В смысле таки адрес своей "int13" пихает в таблицу интерраптов?
     
  19. Govnodozer

    Govnodozer New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2009
    Сообщения:
    11
    Дабы не создавать новую тему, подниму старую =)
    У меня ядро находится начиная со 2-го сектора, т.е. я гружусь, читаю N секторов, начиная со 2-го, и просто передаю туда управление.
    С дискеты/винта всё грузится замечательно. А вот с флэшки при чтении выдаёт ошибку 08 (Сбой DMA).

    Мож у кого есть идеи, почему?

    Пишу на GNU ASM.
    Код (Text):
    1. BOOTSEG = 0x9000
    2.  
    3. .code16
    4. .text
    5. .globl _start
    6.  
    7. _start:
    8.     cli
    9.     movw        %cs, %ax
    10.     movw        %ax, %ss
    11.     movw        $0x7c00, %sp
    12.     movw        %sp, %si
    13.     movw        %ax, %ds
    14.     movw        %ax, %es
    15.     sti
    16.     cld
    17.     movw        $0x7c0, %ax
    18.     movw        %ax, %ds
    19.     movw        $BOOTSEG, %ax
    20.     movw        %ax, %es
    21.     xorw        %si, %si
    22.     xorw        %di, %di
    23.     movw        $128, %cx
    24.     rep         movsd
    25.     ljmp        $BOOTSEG, $go
    26.  
    27. go:
    28.     movw        %cs, %ax
    29.     movw        %ax, %ss
    30.     movw        %ax, %ds
    31.     movb        %dl, %bl
    32.     call        print_num
    33.     movw        $boot_msg, %si
    34.     call        show_str
    35.  
    36. //Check for BIOS Extensions
    37.     movb        $0x41, %ah
    38.     movw        $0x55AA, %bx
    39.     int         $0x13
    40.     jc          no_bios_ex
    41.  
    42. //read
    43.     movw        $BOOTSEG, %ax
    44.     movw        %ax, %ds
    45.     leaw        dap_struct, %si
    46.     movb        $0x42, %ah
    47.     int         $0x13
    48.     jc          read_error
    49.  
    50.     ljmp        $0x0, $0x4000
    51.  
    52. inf1:     jmp     inf1
    53.  
    54. no_bios_ex:
    55.     movw        $biosex_absent, %si
    56.     call        show_str
    57.     jmp         inf1
    58.  
    59. read_error:
    60.     movw        $error_read_msg, %si
    61.     call        show_str
    62.     movw        %ax, %bx
    63.     call        print_num
    64.     jmp         inf1
    65.  
    66. print_num:
    67.     pushw       %ax
    68.     pushw       %di
    69.     movb        $0x30, %al
    70.     call        print_sym
    71.     movb        $0x78, %al
    72.     call        print_sym
    73.     movb        %bh, %al
    74.     shrb        $4, %al
    75.     andw        $0xf, %ax
    76.     movw        $hex_table, %di
    77.     addw        %ax, %di
    78.     movb        (%di), %al
    79.     call        print_sym
    80.     movb        %bh, %al
    81.     andw        $0xf, %ax
    82.     movw        $hex_table, %di
    83.     addw        %ax, %di
    84.     movb        (%di), %al
    85.     call        print_sym
    86.     movb        %bl, %al
    87.     shrb        $4, %al
    88.     andw        $0xf, %ax
    89.     movw        $hex_table, %di
    90.     addw        %ax, %di
    91.     movb        (%di), %al
    92.     call        print_sym
    93.     movb        %bh, %al
    94.     andw        $0xf, %ax
    95.     movw        $hex_table, %di
    96.     addw        %ax, %di
    97.     movb        (%di), %al
    98.     call        print_sym
    99.     popw        %di
    100.     popw        %ax
    101.     ret
    102.  
    103. print_sym:
    104.     pushw       %ax
    105.     pushw       %bx
    106.     pushw       %cx
    107.     pushw       %dx
    108.     movb        $0x9, %ah
    109.     xorb        %bh, %bh
    110.     movb        $0xf,%bl
    111.     movw        $1,  %cx
    112.     int         $0x10
    113.     movb        $0x3, %ah
    114.     int         $0x10
    115.     incb        %dl
    116.     movb        $0x2, %ah
    117.     int         $0x10
    118.     popw        %dx
    119.     popw        %cx
    120.     popw        %bx
    121.     popw        %ax
    122.     ret
    123.  
    124. show_str:
    125.     pushw       %ax
    126.     pushw       %bx
    127. show_str_loop:
    128.     lodsb
    129.     cmpb        $0, %al
    130.     je          str_shown
    131.     pushw       %si
    132.     movb        $0xe, %ah
    133.     movb        $0, %bh
    134.     int         $0x10
    135.     popw        %si
    136.     jmp         show_str_loop
    137. str_shown:
    138.     popw        %bx
    139.     popw        %ax
    140.     ret
    141.  
    142. hex_table: .ascii "0123456789ABCDEF"
    143. boot_msg:
    144.     .ascii "Booting data ..."
    145.     .byte 0xA, 0xD, 0x0
    146.  
    147. biosex_absent:
    148.     .ascii "Bios Extensions are not supported!"
    149.     .byte 0xA, 0xD, 0x0
    150.  
    151. error_read_msg:
    152.     .ascii "error read"
    153.     .byte 0xA, 0xD, 0x0
    154.  
    155. read_track_msg:
    156.     .ascii "read track"
    157.     .byte 0xA, 0xD, 0x0
    158.  
    159. load_msg:
    160.     .ascii "done"
    161.     .byte 0xA, 0xD, 0x0
    162.  
    163. dap_struct:
    164.     .byte 0x10
    165.     .byte 0x0
    166.     .short 200
    167.     .long 0x00004000
    168.     .quad 0x2
    169.     .quad 0x0
    170.  
    171. .org    510
    172. end_boot:       .short          0xAA55
     
  20. Treant

    Treant Member

    Публикаций:
    0
    Регистрация:
    24 май 2009
    Сообщения:
    248
    Govnodozer
    Может ты просто не правильно на флешку MBR записываешь?
    Я из под винды записывал HDHacker' ом все нормально робит
    А вот WinImage заливает туда всякого, чтобы не испортить файловую систему.
    Судя по ошибке , что то не так записано где то (если DMA-Direct Memory Access)...